#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-02-27 11:34:10 发布