快速排序思想有点乱啊,思路基本上是理清楚了,但是写代码还是把我绕晕了两小时,明天再来继续理清……代码只能实现部分数组的排序,对于一些特殊数组,如1,1,5,1,1,1,4,1,1,546就乱掉了
【参考链接】写得非常好的,对快速排序的解释,简单易懂快速排序思想
using namespace std;
int AdjustArray(int a[], int x, int y);
void swap(int a[], int x, int y);
void QuickSearch(int a[], int l, int r);
int main()
{
int a[10] = {1,12,5,31,41,11,4,91,12,546};
QuickSearch(a, 0, 9);
for (int i = 0; i < 10;i++)
{
cout << a[i] << endl;
}
return 0;
}
void QuickSearch(int a[],int l,int r)
{
if (l < r)
{
int i = AdjustArray(a, l, r);
QuickSearch(a, l, i - 1);
QuickSearch(a, i+1, r);
}
}
int AdjustArray(int a[], int x, int y)//y是数组小标,不是长度
{
int X = a[x];
int j = y;
for (int i = x; i <= y;)
{
while (i < j)
{
while (a[j]>X)
{
j--;
}
swap(a, i, j);
while (a[i] < X)
{
i++;
}
swap(a, i, j);
}
return i;
}
}
void swap(int a[], int x, int y)
{
int temp;
temp = a[x];
a[x] = a[y];
a[y] = temp;
}
复习时使用正确版本
int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置
{
int i = l, j = r;
int x = s[l]; //s[l]即s[i]就是第一个坑
while (i < j)
{
// 从右向左找小于x的数来填s[i]
while(i < j && s[j] >= x)
j--;
if(i < j)
{
s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
i++;
}
// 从左向右找大于或等于x的数来填s[j]
while(i < j && s[i] < x)
i++;
if(i < j)
{
s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
j--;
}
}
//退出时,i等于j。将x填到这个坑中。
s[i] = x;
return i;
}