楼主你好,根据你代码的情况,你选择的快速排序算法大概是这个思路吧:
给出一个列数字,以第一个数为基准,第二个数开始向右查找,与基准数对比;同时在末尾向左查找,与基准数对比;其中,左边查找的数值若比基准值小则与右边查找的位置交换数值,否则查找下一位,右边查找的数值若比基准值大则与左边查找的位置交换数值,否则查找下一位。直到两边查找碰头。然后把第一个数插入碰头出,那么此时左边的数不小于基准值,右边的数不大于基准值。递归操作,得到最后从大到小的排列了。
根据这个算法编写如下代码,楼主可以看看(勉强写完,还没优化):
//快速排序算法(一)由大到小排列
#include <stdio.h>
//快速排序算法(一)函数
void quicksort_01(int num[], int left, int right);
int main(void)
{
int i = 0, a[11]={0,45,68,12,32,7,456,258,85,123,357};
quicksort_01(a,1,10);
printf("快速排序后大到小顺序为:\n");
for(i=1;i<=10;i++)
printf("%d\t", a[i]);
return 0;
}
//快速排序算法(一)函数
void quicksort_01(int num[], int left, int right)
{
int i = left + 1, j = right;
int tmp = 0;
int s = num[left];
if(i < j)
{
while(i < j)
{
//若左边找到比s小或者右边找到比s大的数值,就i,j数值交换
if(num[i] < s || num[j] > s)
{
tmp = num[i];
num[i] = num[j];
num[j] = tmp;
}
while(num[i] >= s)//从左边找,不小于s的不变
{
i++;
break;
}
while(num[j] <= s)//左边找一次,再从右边找,不大于s的不变
{
j--;
break;
}
}
//根据i和j查找,最后i和j碰头的情况确定递归
if(i == j)//i x j查找,然后i和j重合
{
if(s <= num[j])//i和j重合时,刚好代表数值不小于s时
{
num[left] = num[j];
num[j] = s;
quicksort_01(num, left, j-1);
quicksort_01(num, j+1, right);
}
else//i和j重合是,刚好代表数值小于s时
{
num[left] = num[j-1];
num[j-1] = s;
quicksort_01(num, left, j-2);
quicksort_01(num, j, right);
}
}
else//i j查找,然后变为j i的情况
{
num[left] = num[j];
num[j] = s;
quicksort_01(num, left, j-1);
quicksort_01(num, j+1, right);
}
}
}