三步排序

三部排序
一般的排序有许多经典算法,如快速排序、希尔排序等。
但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。
比如,对一个整型数组中的数字进行分类排序:
使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!
以下的程序实现了该目标。
其中x指向待排序的整型数组,len是数组的长度。

思路:该三部排序算法的直观意思就是,负数放左边,正数放右边,零放在中间。那样,每个数就要判断一下,放在哪里,该如何移动。

#include<stdio.h>
int main()
{
    int a[1000],n;
    scanf("%d",&n);int i;
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);

    int left=0,right=n-1,k=0,t;
    while(k<=right)
    {
        if(a[k]<0)
            {
            t=a[left];
            a[left]=a[k];
            a[k]=t;
            left++;
            k++;///如果这里不写k++,恰好a[0]为负,将陷入死循环
            }
        else if(a[k]>0)
            {
                t=a[right];
                a[right]=a[k];
                a[k]=t;
              ///经过模拟K++;不能在这里随便加,
              ///因为在边界上可能会跳过一些数据继续向下执行
                right--;
            }
        else
        {
            k++;
        }
     }
        int j;
        for(j=0;j<n;j++)
        {
            printf("%d ",a[j]);
        }

    return 0;
}



猜你喜欢

转载自blog.csdn.net/qiuyushuofeng/article/details/50884367