快速排序

来源:互联网 发布:淘宝的直通车怎么开 编辑:程序博客网 时间:2024/06/08 10:25
思想:形参定为数组的上、下界(注意主函数所传实参为0、n-1,因为n-1的事儿我wrong了好多次),以升序为例,记录下标最小的数,
      第一轮从后往前扫,遇到比标记数小的数时,做交换;同时改变移动方向,从前往后扫,遇到比标记数大的数就交换到后面,
      交换时注意数组下标越界问题(想了好久才想通,越界作交换思路就错了);第一轮结束后可以找到最开始标记数的位置,把
      标记数存进去。接下来依次对前面和后面调用递归(只做上下界的改变)


解题代码:
#include <stdio.h>
#define N 100000
void Input(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
}

void Quick(int a[],int low,int high)
{
    int i,j,k,temp;
    i=low;
    j=high;
    k=a[i];
    if(i>j)
        return ;
    while(i!=j)
    {
        while(a[j]>k&&i<j)
            j--;
        if(i<j)
        {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            i++;
        }
        while(a[i]<k&&i<j)
            i++;
        if(i<j)
        {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            j--;
        }
    }
    a[i]=k;
    Quick(a,low,i-1);
    Quick(a,i+1,high);
}

void Output(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
}

int main()
{
    int a[N],n,k;
    printf("请输入数据个数:\n");
    scanf("%d",&n);
    Input(a,n);
    Quick(a,0,n-1);
    Output(a,n);
    return 0;
}
0 0
原创粉丝点击