快速排序(一个数组先做偶数排序后做奇数排序)

ContractedBlock.gif ExpandedBlockStart.gif DELPHI 代码
procedure TForm1.Button2Click(Sender: TObject);
var
  A1: 
array[0..20of Integer;
  I: Integer;
begin
  
for I := Low(A1) to High(A1) do
  
begin
    Randomize;
    A1[i] :
= Random(100);
  
end;

  QuickSort1(A1, Low(a), High(A1), 
1);
  
for I := Low(A1) to High(A1) do
  
begin
    Randomize;
    Memo1.Lines.Add(IntToStr(A1[i]));
  
end;
end;

procedure QuickSort1(var A: array of Integer; iLo, iHi: Integer; code: Integer);
  
var
    Lo, Hi, Mid, T: Integer;
  
begin
    Lo :
= iLo;
    Hi :
= iHi;
    Mid :
= A[(Lo + Hi) div 2];
    
repeat
      
case code of
      
1:
      
begin
        
while ((A[Lo] mod 2= 0)do
         Inc(Lo);
        
while ((A[Hi] mod 2= 1 )
        
do Dec(Hi);

        
if (Lo <= Hi) then
        
begin
          T :
= A[Lo];
          A[Lo] :
= A[Hi];
          A[Hi] :
= T;
          Inc(Lo);
          Dec(Hi);
        
end;
      
end;

      
2:
       
begin
          
while A[Lo] < Mid do Inc(Lo);
          
while A[Hi] > Mid do Dec(Hi);
          
if Lo <= Hi then
          
begin
            T :
= A[Lo];
            A[Lo] :
= A[Hi];
            A[Hi] :
= T;
            Inc(Lo);
            Dec(Hi);
          
end;
       
end;
    
end;
    
until Lo > Hi;

    
if code = 1 then
    
begin
      QuickSort1(A, iLo, hi, 
2);
      QuickSort1(A, lo, ihi, 
2);
    
end
    
else
    
begin
      
if Hi > iLo then QuickSort1(A, iLo, Hi, 2);
      
if Lo < iHi then QuickSort1(A, Lo, iHi, 2);
    
end;
  
end;
ContractedBlock.gif ExpandedBlockStart.gif C++ 代码
#include <iostream>
using namespace std;
void QucikSort(int a[], int lo, int hi, int code)
{
    int ilo, ihi, mid, temp;
    ilo = lo; 
    ihi = hi;
    mid = a[(lo + hi) / 2];
    while (ilo <= ihi) 
    {
      switch(code) 
      {
        case 1: 
          {    
             while ((a[ilo] % 2) == 0)
                ++ilo;
    
             while ((a[ihi] % 2) == 1)
                --ihi;

            if (ilo <= ihi) 
            {
               temp = a[ilo];
               a[ilo] = a[ihi];
               a[ihi] = temp;
               ++ilo;
               --ihi;
            
}
             
break;
          }
        
case 2:
          
{

            while (a[ilo] < mid)
                ++ilo;
             
            while (a[ihi] > mid)
                --ihi;

            if (ilo <= ihi) 
            {
               temp = a[ilo];
               a[ilo] = a[ihi];
               a[ihi] = temp;
               ++ilo;
               --ihi;
            
}
             
break;
          }
          
default:  break;             
          } 
      }
 
    
if (code == 1
    
{
        QucikSort(a, lo, ihi, 2);
        QucikSort(a, ilo, hi, 2);        
    
}
    
else if (code == 2
    
{    
       if (ihi > lo)   
          QucikSort(a, lo, ihi, 2);
      
       if (ilo < hi) 
           QucikSort(a, ilo, hi, 2);
    
}
}

int main()
{
    int arr[7] = {5, 3, 1, 2, 4, 8, 9
};
    QucikSort(arr, 
061);
    
for (int i = 0; i <= 6; i++)
        cout
<<arr[i]<<endl;
    return 
0;
}


思路: 先用快速排序把偶数排前边,奇数排后边,这里只用快速排序算法第前半部分就可以完成一次遍历
第2步是就是调用常规快速排序了

转载于:https://www.cnblogs.com/chengxin1982/archive/2009/09/16/1567529.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值