排序

Java 排序(这里统一做从小到大排)

快速排序 ·

快速排序用分而治之的思想。对于要排序的数据,选取最左边的作为基准,然后将比基准大的数放到其右边,将比基准小的数放到其左边,然后以基准位子进行分割,对其左右做分治递归操作。

    int[] data;//待排序数组
    //快速排序java代码
    public void quickSort(int[] data,int left,int right){
        if(left<0||right>data.length) return;
        if(left<right){
            int i=left;
            int j=right;
            int base=data[i];
            while(i<j){
                while(i<j&&data[j]>base) j--;
                if(i<j) data[i++]=data[j];
                while(i<j&&data[i]<base) i++;
                if(i<j) data[j--]=data[i];
            }
            data[i]=base;
            quickSort(data,left,i-1);
            quickSort(data,i+1,right);
        }
    }

快速排序可以理解成如下:

首先在最左边挖一个 base=data[i]
然后从最右边开始找一个比这个数小的值来填补这个坑data[i++]=data[j]
此时data[i] 这个坑被data[j] 填补了,现在坑变成了data[j]
然后从左边开始寻找一个比base大的数来填坑 data[j--]=data[i]
不断重复知道 i==j,此时跳出循环将最开始的base填入data[i] 中
这时候就形成了以位置i为分界点左边全部比base小,右边全部比base大的局面
最后递归这个过程就完成看排序

快速排序分析

快速排序复杂度 辅佐空间为O(1)

堆排序

堆排序的主要思想是不断维护一个堆,在这里谈从小到大排序的话就维护一个大顶堆,每次从堆顶取出一个元素(这个元素在堆中是最大的),然后与堆尾交换,之后堆大小减小1,重新调整堆。
要点如下

1 构造 初始化大顶堆
2 从堆顶取出元素与堆尾交换,堆大小减一
3 重新调整被破坏的堆
重复步骤2 直到堆大小为0 此时数组已经被从小到大排序完毕

堆这个数据结构特点:

  1. 父节点一定比左右子节点要大
  2. 堆在存储时有数组存储,父节点ID=i,那么左右子节点ID分别为 2i+1和 2i+2

最开始构造堆时从最后一个非叶子节点开始调整,其ID最大为堆大小一半,调整过程中只需要比较父节点和左右子节点的大小,将最大的作为父节点,如果左右子节点被交换到父节点时,那么此时我们认为被交换的节点之下可能不满足堆的特性,需要对其进行调整,这是一个递归的操作。当所有非叶子节点被调整完毕,那么此时就完成了堆的初始化。
在每次取出对顶元素之后只需要堆从对顶开始调整堆即可。

int data[];
//调整堆
public void adjustHeap(int[] data,int sizeOfHeap,int index){
    int left=2*index+1;
    int right=2*index+2;
    int largest=index;  
    if(left<sizeOfHeap&&data[left]>data[index]) largest = left;
    if(right<sizeOfHeap&&data[right]>data[largest]) largest=right;
    if(largest!=index){
        int tmp=data[index];
        data[index]=data[largest];
        data[largest]=tmp;
        adjustHeap(data,sizeOfHeap,largest);
    }
}


//初始化堆


public void buildMaxHeap(int[] data){
    int size=data.length;
    for(int i=size/2;i>=0;i--){
        adjustHeap(data,size,i);
    }
}

//完全堆排序
public void sortHeap(int[] data){
    for(int i=data.length-1;i>=0;i--){
        int tmp=data[0];
        data[0]=data[i];
        data[i]=tmp;
        adjustHeap(data,i,0);
    }
}

同时根据堆的性质,在一个序列里面取出TopK个数据非常适合堆排序的方式来做到。

public void getTopK(int[] data){
    int startN=data.length-1;
    int endN=startN-k+1;
    if(endN<0) return;
    for(int i=startN;i>=endN;i--){
        int tmp=data[0];
        data[0]=data[i];
        data[i]=tmp;
        adjustHeap(data,i,0);
    }
}

从数组尾部读取K个即可,当然这里是取得最大的K 个,如果需要最小的K个则可以使用小顶堆。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,101评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,706评论 0 15
  • 011讲:MBTI测试|认识自己是一切管理的前提 笔记金句 1、一切管理都是从认识自己开始的。假如你是一个群体的核...
    川行天下阅读 680评论 0 1
  • 上联:真男儿创业气吞万里; 下联:大丈夫投资威振八方。 横批:宏图美景。 石高宏为创业英雄周鸿祎先生撰写赞联。
    石高宏阅读 192评论 0 1
  • 全目录|【爱在失忆的日子】 上一章|爱在失忆的日子(66) 手机铃声依旧不悲不喜地循环响着,顾羽始终没有接听电话。...
    小豆利子阅读 439评论 2 18