zoukankan      html  css  js  c++  java
  • 快速排序

         设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

        平均时间复杂度:尽管快速排序的最坏时间为 O(n^2 ), 但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快的,快速排序亦因此而得名。它的平均时间复杂度为 O(n×lgn)
        空间复杂度:快速排序在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为 O(lgn), 故递归后所需栈空间为 O(lgn) 。最坏情况下,递归树的高度为 O(n), 所需的栈空间为 O(n) 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void quick_sort(int b[], int left, int right)//升序(以left为key值设计的)
    {
        int i = left + 1 , j = right;
        int  key = b[ left];
        if (left >= right) return;//结束条件
        while(1)
        {
             while(b [j]> key)j --;//找小于等于key的值,用左边的首个值作为key,保证了j最多只到left,不会越界,也只有在这里才会导致出现i>j
             while(b [i]< key&&i <j) i++;//找大于等于key的值,这里要保证i<j;
                   // while(b [j]<key)j --;    //这样就能逆序排序了
                   // while(b [i]>key&&     i <j) i++;
             if(i >=j) break;
             {swap(& b[i],&b [j])} //这里交换以后,i的位置就是保存的小于等于key的值,j的位置保存的就是大于等于key的值
             if(b [i]== key)j --;                                               
             else
                i ++;
        }
        if(left!=j )swap(& b[left],&b [j]);
        quick_sort(b ,left, i-1);                                             
        quick_sort(b ,j+ 1,right );
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    void quick_sort(int b[], int left, int right)//降序(以right为key值设计)
    {
        int i = left, j = right-1;
        int  key = b[right];
        if (left >= right) return;
            while(1)
           {
                   while(b[i]>key)i++;
                   while(b[j]<key&&i<j)j--;
                   if(i>=j)break ;
                   {swap(&b[i],&b[j]);}
                   if(b[j]==key)i++;
                   else
                          j--;
           }
           swap(&b[right],&b[i]);
            
           quick_sort(b,left,i-1);                                             
           quick_sort(b,j+1,right);
    }
    void swap(int *a,int *b)
    {
            
            int t=*a;
           *a=*b;
           *b=t;
            return;
    }

      

  • 相关阅读:
    河南省第十二届大学生程序设计竞赛 F: Information Transmission-1(二分图最大匹配)
    hdu1068:Girls and Boys(最大独立集)
    hdu1068:Girls and Boys(最大独立集)
    hdu1281:棋盘游戏(二分图最大匹配)
    hdu1281:棋盘游戏(二分图最大匹配)
    洛谷P1991 :无线通讯网(最小生成树)
    洛谷P1991 :无线通讯网(最小生成树)
    oGitHub 注册
    Lambda应用设计模式 [转载]
    读取excel数据 到 datagrid 出现 找不到可安装的ISAM
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/5285614.html
Copyright © 2011-2022 走看看