快速排序中的分割问题
快排依赖递归算法,是种稳定的排序算法。
对于给定一正整数序列{K1,K2,...,K9}重新排列成一个新的序列。新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面)。
下面宏定义中将N设为9
用一个量标记k1,分别用high和low从数组的后面和前面标记,若[high]比initial_num大,则该数不动,high往前移动1个单位,否则[high]赋给[low],此时[low]标记的数都是重复数字,下一步[low]开始移动,方法类似,由于赋值后原来的数还存在,可能会在我的代码中给判断带来一些错误,在任何一步计算都要处理,代码很长,废话很多
include <stdio.h>
define N 9
int main()
{
int a[N] = { 0 };
for (int i = 0; i < N; i++)
scanf_s("%d", &a[i]);
int initial_num = a[0];
int high = N - 1, low = 0;
while (high>low)
{
while (low<high && a[high]>=initial_num)high--;
a[low++] = a[high];
while (low < high && a[low] <= initial_num)low++;
a[high--] = a[low];
}
a[low] = initial_num;
for (int i = 0; i < N; i++)
printf("%d ", a[i]);
}
//下面是参考书的另一种写法
int a[N]={0};
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
int low=0,high=N-1;
int initial_num=a[low];
for(;;)
{
while(low<high&&initial_num<=a[high])
high--;
if(low>=high) break;
a[low++]=a[high];
while(low<high&&a[low]<=initial_num)
low++;
if(low>=high) break;
a[high--]=a[low];
}
a[high]=initial_num;
for(int i=0;i<N;i++)
printf("%d ",a[i]);
}
//判断写在每个while里,这样就能避免在循环因为自增,没有及时跳出循环而出现错误
分割是快速排序的重要一步,其余排序的方法只知道冒泡排序与选择排序,希望能提出新的排序方法,同时我的代码能不能简化呢?

浙公网安备 33010602011771号