zoukankan      html  css  js  c++  java
  • 排序算法——快排思想

    快速排序

    1、思想

      快速排序将一个数组分成两个数组,再对两个数组独立排序,是个递归算法。

      首先随机选出一个切分元素temp(一般为这个数组的第一个元素),将小于temp的数放在temp的左边,将大于temp的数放在temp的右边。

      快排和堆排序很像,他们都是将一个数组分成两个子数组,都属于递归算法。但是不同之处在于:快排空间复杂度为o(1),而堆排为o(n),

    快排是原地排序,只需要一个很小的辅助栈,时间复杂度为NlogN。

    2、代码实现(java)

    public class Quick {
        
        public static void sort(int[] a,int lo,int hi) {
            if(hi<=lo) return;
            //切分
            int j = partition(a,lo,hi);
            sort(a,lo,j-1);
            sort(a,j+1,hi);
            
        }
        //a[j]就是那个切分元素,从数组的左端开始向右扫描直到找到一个大于等于它的元素
        //再从数组的右端开始向左扫描直到找到一个小于等于它的元素,将这两个元素交换位置。
        public static int partition(int[] a,int lo,int hi) {
            //左右扫描数组
            int j = lo;
            int i = hi+1;;
            int v = a[lo];
            while(true) {
                while(v>=a[++j]){
                    if(j==hi) break;
                    //j++;
                }
                while(v<=a[--i]) {
                    if(i==lo) break;
                    //i--;
                }
                if(j>=i) {
                    break;
                }
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
            a[lo] = a[j];
            a[j] = v;
            return j;
        }

        public static void main(String[] args) {
            int[] a = {49,78,23,34,67,45,73,90,120,12,20,9,5};
            int lo = 0;
            int hi = a.length-1;
            sort(a,lo,hi);
            for(int i=0;i<a.length;i++) {
                System.out.print(a[i]+" ");
            }

        }

    }

  • 相关阅读:
    在响应式项目中连接设计与开发
    社交APP的痛点及九大流派解析,微信陌陌,咱还约吗
    网传奶茶妹将进入红杉资本
    OLE、OCX和ActiveX控件之间的比较
    Unity3D网络游戏实战(第2版)
    离婚?在Facebook上把已婚状态改为单身就可以!
    同样酷炫但却失败了的谷歌眼镜,能否给Apple Watch一些前车之鉴?
    Apple Watch首批评测放出:有吐槽、有体贴……毒哭了,暖哭了
    如何培养战略领导力,赢得“长久游戏”?
    博客社交已死,数据社交“永生”
  • 原文地址:https://www.cnblogs.com/shuqicui/p/day3.html
Copyright © 2011-2022 走看看