//快速排序升序的实现原理
//比pivot中轴小的到左边,比pivot大的到右边
//high小而赋值(给low),大而移动
//low小而移动,大而赋值(给high)
//low/high相等时,此轮结束
#include <stdio.h>
void quickSortUp(int* p,int low,int high)// 升序排列
{
if(low < high)
{
int l = low;
int h = high;
int pivot = p[l];
while(l < h)//相等时就达到了pivot要填的下标位置 //注意点1 这里不能使用<=,多了=会死循环
{
while(p[h] >= pivot && h>l)//注意点2 这里不能使用<,少了=会死循环
{
h--;
}
p[l] = p[h];
while(p[l] <= pivot && l<h)//注意点2 这里不能使用<,少了=会死循环
{
l++;
}
p[h] = p[l];
}
int pos = h;//pos = l;
p[pos] = pivot;
quickSortUp(p,low,pos-1);//左半边
quickSortUp(p,pos+1,high);//右半边
}
}
//快速排序 降序实现
void quickSortDown(int* p,int low,int high)//降序排列
{
if(low < high)
{
int l = low;
int h = high;
int pivot = p[l];
while(l < h)//注意点1 这里不能使用<=,多了=会死循环
{
while(p[h] <= pivot && h>l)//注意点2 这里不能使用<,少了=会死循环
{
h--;
}
p[l] = p[h];
while(p[l] >= pivot && l<h)
{
l++;
}
p[h] = p[l];
}
int pos = h;//pos = l;
p[pos] = pivot;
quickSortDown(p,low,pos-1);//左半边
quickSortDown(p,pos+1,high);//右半边
}
}
int main(void)
{
int arrtest[] = {6,1,7,4,9,8,2,3,5,0,9};
// int arrtest[] = {9,1,7,4,9,8,2,6,9,3,5,0,9};
quickSortDown(arrtest,0,sizeof(arrtest)/sizeof(*arrtest)-1);
int i;
for(i = 0;i<sizeof(arrtest)/sizeof(*arrtest);i++)
{
printf("%3d",arrtest[i]);
}
putchar(10);
return 0;
}