zoukankan      html  css  js  c++  java
  • SDUT 数据结构实验之排序八:快速排序

    Problem Description
    nbvg
    给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使用STL。

    Input

    连续输入多组数据,每组输入数据第一行给出正整数N(≤10^5),随后给出N个整数,数字间以空格分隔。
    Output

    输出排序后的结果,数字间以一个空格间隔,行末不得有多余空格。
    Example Input

    8
    49 38 65 97 76 13 27 49
    Example Output

    13 27 38 49 49 65 76 97
    Hint

    Author oh/ubvgy;

    代码

    #include <stdio.h>
    //快排函数
    void qsort(int a[],int l,int r)
    {
        int k = a[l],i=l,j=r;  //确定左边界右边界 key值
        if(l>=r)return;       //左边界大于右边界,退出函数
        while(i<j)             //一次排序
        {
            while(i<j&&a[j]>=k) j--; 
                a[i] = a[j];      //如果a[j]<k,将a[j]交换到k的左侧
            while(i<j&&a[i]<=k) i++;
                a[j] = a[i];    //如果a[i]>k,将a[j]交换到k的右侧
        }
        a[i]=k;    
        qsort(a,l,i-1);
        qsort(a,i+1,r);
    }
    //主函数
    int main()
    {
        int N;
        int i;
        int a[100001];
        while(~scanf("%d",&N))
        {
            for(i=0;i<N;i++)
            {
                scanf("%d",&a[i]);
            }
             //数组储存待排序数字
            qsort(a,0,N-1);//调用快排函数
            //格式化输出
            for(i=0;i<N;i++)
            {
                if(i==N-1)
                    printf("%d
    ",a[i]);
                else
                    printf("%d ",a[i]);
            }
    
        }
        return 0;
    }
    

    解惑

    一直感觉这样的覆盖会丢失数据,仔细观察以后,发现:被覆盖的只有左边界的数据,而此数据已保存在K中,之后的交换不存在覆盖。

    后来发现,有的前辈,快排函数只用2个参数,以后我也用两个,第一个参数,不明觉厉。

  • 相关阅读:
    es6 可迭代对象
    前端模板
    快速排序
    parseHTML2Vnode
    最大并发请求
    选择排序
    window命令
    Asp.net问题集锦
    ExtJs5.1.1使用中问题集锦
    Sql Server问题集锦
  • 原文地址:https://www.cnblogs.com/lushans/p/6740707.html
Copyright © 2011-2022 走看看