首页 > 编程语言 > 详细

分组排序中的分割问题

时间:2020-11-19 09:31:38      阅读:46      评论:0      收藏:0      [点我收藏+]

对于给定一正整数序列{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("%d",&a[i]);
int initial_num=a[0];
int high=N-1,low=0;
while(1)
{
	if(low==high) 
	{
		a[high]=initial_num;
		break;
	}
	while(a[high]>initial_num) 
	{
		high--;
	}
	if(a[high]<initial_num) 
	{
	a[low]=a[high];
	a[high]=initial_num;
		low++; 
	}
	while(a[low]<initial_num) 
	{
		low++;

	}
	if(a[low]>initial_num)
	{
		a[high]=a[low];
		a[low]=initial_num;
		high--; 
	}
}

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里,这样就能避免在循环因为自增,没有及时跳出循环而出现错误
//a[low++]的写法替代了两行语句,没有if的判断,同时省略赋值这一步,if应该是多余的,可是我的代码不能去掉if
//我的代码没有考虑相同数字在数列的情况,有待完善
分割是快速排序的重要一步,其余排序的方法只知道冒泡排序与选择排序,希望能提出新的排序方法,同时我的代码能不能简化呢?

分组排序中的分割问题

原文:https://www.cnblogs.com/tzp-empty-hya/p/14003116.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!