zoukankan      html  css  js  c++  java
  • 快速排序算法思想与实现

    快速排序这个思想因其时间复杂度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

     
     
  • 相关阅读:
    leetcode 13. Roman to Integer
    python 判断是否为有效域名
    leetcode 169. Majority Element
    leetcode 733. Flood Fill
    最大信息系数——检测变量之间非线性相关性
    leetcode 453. Minimum Moves to Equal Array Elements
    leetcode 492. Construct the Rectangle
    leetcode 598. Range Addition II
    leetcode 349. Intersection of Two Arrays
    leetcode 171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/nonato/p/3169917.html
Copyright © 2011-2022 走看看