对于给定一正整数序列{K1,K2,...,K9}重新排列成一个新的序列。新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面)。
下面宏定义中将N设为9
用一个量标记k1,分别用high和low从数组的后面和前面标记,若[high]比initial_num大,则该数不动,high往前移动1个单位,否则[high]赋给[low],此时[low]标记的数都是重复数字,下一步[low]开始移动,方法类似,由于赋值后原来的数还存在,可能会在我的代码中给判断带来一些错误,在任何一步计算都要处理,代码很长,废话很多
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