快速排序中的分割问题

快排依赖递归算法,是种稳定的排序算法。
对于给定一正整数序列{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里,这样就能避免在循环因为自增,没有及时跳出循环而出现错误
分割是快速排序的重要一步,其余排序的方法只知道冒泡排序与选择排序,希望能提出新的排序方法,同时我的代码能不能简化呢?

posted @ 2020-11-19 00:31  empty_thought  阅读(176)  评论(0)    收藏  举报