快速排序 quicksort 细节问题

[cpp]  view plain  copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. template <class ElementType>  
  5. int QuickPart(ElementType* iArray,int first,int last)  
  6. {  
  7.     /* 
  8.         1.将标准记录存储于temp中 temp = iArray[i] 
  9.         2.令j=last,将iArray[j]的值与temp比较,直到找到第一个temp>iArray[j]时停止,然后执行iArray[i++]=iArray[j] 
  10.         3.将iArray[i]的值与temp比较,知道找到第一个temp<iArray[i]时停止,然后执行iArray[j--]=iArray[i] 
  11.         4.反复执行2 3,直到i==j停止,执行iArray[i]=temp,返回i 
  12.     */  
  13.     int i = first,j = last;  
  14.     ElementType temp = iArray[i];  
  15.     while(i != j)  
  16.     {  
  17.         while(i < j && iArray[j] > temp)  
  18.             j = j - 1;  
  19.         /* 
  20.             至于这里需要一个if判断,否则会出现错误 
  21.                 例如当执行完上面的while,切只循环一次(也就是说last-first=1) 
  22.                 i    j 
  23.                 |    | 
  24.                 1   100 
  25.                 执行完while的一次循环i==j 
  26.                 i=j 
  27.                  | 
  28.                  1 
  29.         */  
  30.         if(i < j)  
  31.             iArray[i++] = iArray[j];  
  32.         /* 
  33.             假如没有if 
  34.                 1=1 
  35.                 之后 
  36.                 j   i 
  37.                 |   | 
  38.                 1  100 
  39.         */  
  40.   
  41.         while(i < j && iArray[i] < temp)  
  42.             i = i + 1;  
  43.         /* 
  44.             上面的while不会执行 
  45.             假如没有if,但是下面这个iArray[j--] = iArray[i];会执行 
  46.             此时 
  47.                 j   i 
  48.                 |   | 
  49.                 1  100 
  50.         */  
  51.         if(i < j)  
  52.             iArray[j--] = iArray[i];  
  53.         /* 
  54.             执行完 
  55.             j   i 
  56.             |   | 
  57.            100 100 
  58.            由此会出现错误 
  59.         */  
  60.   
  61.     }  
  62.     iArray[i] = temp;  
  63.     return i;  
  64. }  
  65. template <class ElementType>  
  66. void QuickSort(ElementType* iArray,int first,int last)  
  67. {  
  68.     if(first >= last)return;  
  69.     int pos = QuickPart(iArray,first,last);  
  70.     QuickSort(iArray,first,pos-1);  
  71.     QuickSort(iArray,pos+1,last);  
  72. }  
  73. int main()  
  74. {  
  75.     int iArray[]={0,50,100,256,15,3,87,45,60,200,300};  
  76.     QuickSort(iArray,1,10);  
  77.     for(int i = 1; i <= 10; i++)  
  78.         cout<<iArray[i]<<" ";  
  79.         cout<<endl;  
  80.     char cArray[]={0,'d','f','q','z','g','y','i','o','m','h'};  
  81.     QuickSort(cArray,1,10);  
  82.     for(i = 1; i <= 10; i++)  
  83.         cout<<cArray[i]<<" ";  
  84.         cout<<endl;  
  85.     float fArray[]={0,1.2f,5.6f,10.9f,12.5f,0.5f,9.9f,80.5f,9.7f,2.2f,0.9f};  
  86.     QuickSort(fArray,1,10);  
  87.     for(i = 1; i <= 10; i++)  
  88.         cout<<fArray[i]<<" ";  
  89.         cout<<endl;  
  90.     return 0;  
  91. }  
  92. /* 
  93.     之前可能因为一些原因都没有发现这个细节,知道有个朋友问我为什么快排总是出现错误 
  94.     我才好好看了看,原来是这个原因 
  95. */  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值