- #include <iostream>
- using namespace std;
- template <class ElementType>
- int QuickPart(ElementType* iArray,int first,int last)
- {
- /*
- 1.将标准记录存储于temp中 temp = iArray[i]
- 2.令j=last,将iArray[j]的值与temp比较,直到找到第一个temp>iArray[j]时停止,然后执行iArray[i++]=iArray[j]
- 3.将iArray[i]的值与temp比较,知道找到第一个temp<iArray[i]时停止,然后执行iArray[j--]=iArray[i]
- 4.反复执行2 3,直到i==j停止,执行iArray[i]=temp,返回i
- */
- int i = first,j = last;
- ElementType temp = iArray[i];
- while(i != j)
- {
- while(i < j && iArray[j] > temp)
- j = j - 1;
- /*
- 至于这里需要一个if判断,否则会出现错误
- 例如当执行完上面的while,切只循环一次(也就是说last-first=1)
- i j
- | |
- 1 100
- 执行完while的一次循环i==j
- i=j
- |
- 1
- */
- if(i < j)
- iArray[i++] = iArray[j];
- /*
- 假如没有if
- 1=1
- 之后
- j i
- | |
- 1 100
- */
- while(i < j && iArray[i] < temp)
- i = i + 1;
- /*
- 上面的while不会执行
- 假如没有if,但是下面这个iArray[j--] = iArray[i];会执行
- 此时
- j i
- | |
- 1 100
- */
- if(i < j)
- iArray[j--] = iArray[i];
- /*
- 执行完
- j i
- | |
- 100 100
- 由此会出现错误
- */
- }
- iArray[i] = temp;
- return i;
- }
- template <class ElementType>
- void QuickSort(ElementType* iArray,int first,int last)
- {
- if(first >= last)return;
- int pos = QuickPart(iArray,first,last);
- QuickSort(iArray,first,pos-1);
- QuickSort(iArray,pos+1,last);
- }
- int main()
- {
- int iArray[]={0,50,100,256,15,3,87,45,60,200,300};
- QuickSort(iArray,1,10);
- for(int i = 1; i <= 10; i++)
- cout<<iArray[i]<<" ";
- cout<<endl;
- char cArray[]={0,'d','f','q','z','g','y','i','o','m','h'};
- QuickSort(cArray,1,10);
- for(i = 1; i <= 10; i++)
- cout<<cArray[i]<<" ";
- cout<<endl;
- float fArray[]={0,1.2f,5.6f,10.9f,12.5f,0.5f,9.9f,80.5f,9.7f,2.2f,0.9f};
- QuickSort(fArray,1,10);
- for(i = 1; i <= 10; i++)
- cout<<fArray[i]<<" ";
- cout<<endl;
- return 0;
- }
- /*
- 之前可能因为一些原因都没有发现这个细节,知道有个朋友问我为什么快排总是出现错误
- 我才好好看了看,原来是这个原因
- */
快速排序 quicksort 细节问题
最新推荐文章于 2022-01-10 10:50:56 发布