• 快速排序算法思想与实现


    快速排序这个思想因其时间复杂度O(N*logN)效率较高,算法容易理解,故面试时候时常有考察到,对于递归和分治的思想也是个促进。

    算法思想:挖坑填数 + 分治
     1.先从数列中取出一个数作为基准数。
     2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
     3.再对左右区间重复第二步,直到各区间只有一个数。 

    // 简而言之:找准自己的位置
     假设是从小到大排列:
     找的思想就是 用两个指针,一个指针从前向后的搜索,另一个从后往前搜索,遇到比S[0] 大的丢到后面,比S[0]小的丢到前面去。X=S0
     具体操作:
     1. j 从 r 开始,遇到比si小的停下来,把该数填到i的位置 SI=SJ  I++(注意,1 2 步骤不能反过来)
     2.i 从l 扫描,遇到比sj大的则停下来,把该数填到j的位置 SJ=SI J--
     3. 重复1 2 操作,直到 i=j 则此时 SJ就是X的位置
     如:
         0   1       2     3       4        5        6       7         8        9
         72     6       57      88      60      42      83      73      48      85
     第一遍   48     6       57      88      60      42      83      73      48      85(48填了第0个坑)
     
     

    int findMyPosition(int s[], int l, int r)
    {
        int i=l,j=r;
        int X=s[l];
        while (i<j) {
            while(i<j && s[j] >= X) {//从右向左找小于x的数来填s[i]
                j--;
            }
            if (i<j) {
                s[i]=s[j];//
                i++;
            }
            
            while(i<j && s[i]<X) {  // 从左向右找大于或等于x的数来填s[j]
                i++;
            }
            if (i<j) {
                s[j]=s[i];
                j--;
            }
        }
        s[i]=X;
        return i;
    }
    
    //用分治法对其他的排序
    void quickSort(int s[],int l, int r)
    {
        if (l < r)
        {
           int i= findMyPosition(s, l, r);
            quickSort(s, l, i-1);// 递归调用排前面的数的序
            quickSort(s, i+1,r);
        }
    }

    以下是两个函数的整合

    void quick_sort1(int s[], int l, int r)
    {
        int i=l,j=r;
        int X=s[l];
        if (i<j) {
            while (i<j) {
                while(i<j && s[j] >= X) {//从右向左找小于x的数来填s[i]
                    j--;
                }
                if (i<j) {
                    s[i]=s[j];//填充
                    i++;
                }
                
                while(i<j && s[i]<X) {  // 从左向右找大于或等于x的数来填s[j]
                    i++;
                }
                if (i<j) {
                    s[j]=s[i];
                    j--;
                }
            }
            s[i]=X;
            quick_sort1(s, l, i-1);
            quick_sort1(s, i+1, r);        
        }
    }
    View Code

    测试函数

     1 int main(int argc, const char * argv[])
     2 {
     3 
     4     @autoreleasepool {
     5         int s[]={1,334,5,53,3,63,646,6,47,56};
     6         quick_sort1(s, 0, 10);
     7         // quickSort(s, 0,10);
     8         for (int i=0; i<10; i++) {
     9            printf("%d ",s[i]);
    10         } 
    11         
    12     }
    13     return 0;
    14 }
    View Code

    测试结果:

    概念引文地址:http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html

     
     
  • 相关阅读:
    Java集合类总结 (三)
    Java集合类总结 (二)
    Java集合类总结 (一)
    发布方配ASP.NET网站服务器
    Ubuntu重启搜狗输入法
    常用期刊检索
    latex 写大论文图目录中图注过长解决方案
    understanding backpropagation
    Ubuntu安装Adobe Reader
    【转】pdf文件自动切白边
  • 原文地址:https://www.cnblogs.com/nonato/p/3169917.html
Copyright © 2020-2023  润新知