激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

香港云服务器
服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - java堆排序原理及算法實(shí)現(xiàn)

java堆排序原理及算法實(shí)現(xiàn)

2020-09-10 14:00薛定諤的湯姆貓 Java教程

本篇文章主要介紹了堆排序的簡(jiǎn)介,定義,算法實(shí)現(xiàn)以及堆排序的性質(zhì)。想要了解的朋友可以參考下

堆排序的簡(jiǎn)介到堆排序的算法實(shí)現(xiàn)等如下:

1. 簡(jiǎn)介

  堆排序是建立在堆這種數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)上的選擇排序,是原址排序,時(shí)間復(fù)雜度O(nlogn),堆排序并不是一種穩(wěn)定的排序方式。堆排序中通常使用的堆為最大堆。   

2. 堆的定義

  堆是一種數(shù)據(jù)結(jié)構(gòu),是一顆特殊的完全二叉樹(shù),通常分為最大堆最小堆。最大堆的定義為根結(jié)點(diǎn)最大,且根結(jié)點(diǎn)左右子樹(shù)都是最大堆;同樣,最小堆的定義為根結(jié)點(diǎn)最小,且根結(jié)點(diǎn)左右子樹(shù)均為最小堆。

  最大堆滿足其每一個(gè)父結(jié)點(diǎn)均大于其左右子結(jié)點(diǎn),最小堆則滿足其每一個(gè)父結(jié)點(diǎn)均小于其左右子結(jié)點(diǎn)。

3. 堆排序

3.1 堆的存放

  在堆排序中,堆所表示的二叉樹(shù)并不需要使用指針的方式在計(jì)算機(jī)中存放,只需要使用數(shù)組即可,將樹(shù)的結(jié)點(diǎn),從上至下,從左至右一個(gè)個(gè)放到數(shù)組中去。

   因此,如果數(shù)組的起始索引為0,對(duì)于一個(gè)結(jié)點(diǎn)i來(lái)說(shuō),它的父結(jié)點(diǎn)索引為⌊i/2⌋,它的左子結(jié)點(diǎn)索引為2i+1,右子結(jié)點(diǎn)索引為2i+2。最后一個(gè)非葉子節(jié)點(diǎn)就是最后一個(gè)結(jié)點(diǎn)的父親,如果數(shù)組長(zhǎng)度為n,那么其索引為⌊(n-1)/2⌋。

3.2 堆排序主要步驟

將無(wú)序序列構(gòu)建成最大堆

將數(shù)組分成兩個(gè)區(qū)域,有序區(qū)和無(wú)序區(qū),初始時(shí)創(chuàng)建一個(gè)整數(shù)i為數(shù)組的長(zhǎng)度,用來(lái)劃分有序區(qū)和無(wú)序區(qū),有序區(qū)初始為空。

將堆頂元素和最后一個(gè)無(wú)序區(qū)的元素交換,然后i-1。

調(diào)整使得所有無(wú)序區(qū)的元素重新為最大堆。

重復(fù)3,4步,直到 i = 0

3.3 堆的調(diào)整

  假設(shè)有某棵完全二叉樹(shù),其左右子樹(shù)均為最大堆,如何調(diào)整使得該二叉樹(shù)成為最大堆呢?如果根結(jié)點(diǎn)大于左右子結(jié)點(diǎn),那么已經(jīng)是最大堆了,無(wú)需調(diào)整。否則,交換根結(jié)點(diǎn)和左右子結(jié)點(diǎn)中較大的那個(gè)。假設(shè)交換的是左結(jié)點(diǎn),那么目前這棵完全二叉樹(shù)右子樹(shù)仍然是一個(gè)最大堆,左子樹(shù)則不一定,但是左子樹(shù)的左右子樹(shù)還是最大堆,因此不斷遞歸下去調(diào)整即可。

   因此,交換最后一個(gè)元素和堆頂元素后的調(diào)整步驟,就和上面所說(shuō)的一致。而將無(wú)序序列構(gòu)建成最大堆,同樣也可以運(yùn)用這一點(diǎn)。從最后一個(gè)非葉子結(jié)點(diǎn)到第一個(gè)非葉子結(jié)點(diǎn)(根結(jié)點(diǎn)),對(duì)這些結(jié)點(diǎn)作為根結(jié)點(diǎn)的子樹(shù),按順序調(diào)用一次上述描述的調(diào)整即可(每次調(diào)用時(shí),該子樹(shù)的左右子樹(shù)必定是最大堆)。

4. 算法實(shí)現(xiàn)

java" id="highlighter_762991">
?
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
void swap(int *a,int *b) {
 int temp = *a;
 *a = *b;
 *b = temp;
}
//左右子樹(shù)都是最大堆,從上至下調(diào)整使得最大堆, root_index是要調(diào)整的樹(shù)的根節(jié)點(diǎn),length是無(wú)序區(qū)的長(zhǎng)度
void adjust(int array[],int root_index,int length) {
 int left_child = root_index*2+1;
 int right_child = left_child+1;
 int left_or_right = 0;
 if((left_child >= length && right_child >= length) || (left_child >= length && array[root_index] >= array[right_child]) ||
 (right_child >= length && array[root_index] >= array[left_child]) || (array[root_index] >= array[left_child] && array[root_index] >= array[right_child])){
  return;
 }
 else if (array[left_child] >= array[root_index] && (right_child >= length || array[left_child] >= array[right_child])) {
  left_or_right = 1;
 }
 else if (array[right_child] >= array[root_index] && (left_child >= length || array[right_child] >= array[left_child])) {
  left_or_right = 0;
 }
 if(left_or_right) {
  swap(&array[left_child],&array[root_index]);
  adjust(array,left_child,length);
 }
 else {
  swap(&array[right_child],&array[root_index]);
  adjust(array,right_child,length); 
 }
}
//heapsort主遞歸,每一次將無(wú)序區(qū)最后一個(gè)元素與堆頂元素交換,將堆頂元素加入有序區(qū),因此有序區(qū)加1,無(wú)序區(qū)減1,無(wú)序區(qū)只剩一個(gè)元素的時(shí)候遞歸終止
void heapsort_main(int array[],int length,int last_index) {
 int i;
 if(last_index == 0)
  return;
 swap(&array[0],&array[last_index]);
 adjust(array,0,last_index);
 heapsort_main(array,length,last_index-1);
}
//入口函數(shù),array是待排序的數(shù)組,length是其長(zhǎng)度
void heapsort(int array[],int length) {
 int i;
 for(i = length/2-1;i >= 0;i--) {
  adjust(array,i,length);
 }
 heapsort_main(array,length,length-1);
}
int main(int argc,char *argv[]) {
 int array[9] = {1,1,1,2,3,5,2,3,5};
 heapsort(array,9);
 int i;
 for(i = 0;i < 9;i++) {
  printf("%d ",array[i]);
 }
}

5.堆排序性質(zhì)

時(shí)間復(fù)雜度O(nlogn)

空間復(fù)雜度O(1)

不穩(wěn)定排序

本篇文章對(duì)堆排序所整理的內(nèi)容,希望可以幫到需要的朋友

原文鏈接:http://blog.csdn.net/qq_20448859/article/details/69951382

延伸 · 閱讀

精彩推薦
364
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产人成免费爽爽爽视频 | 中文字幕www. | 夜班护士在线观看 | 精品一区免费 | 亚洲va久久久噜噜噜久牛牛影视 | 免费观看一区二区三区视频 | 黄色视频a级毛片 | www.91操| 亚洲草逼视频 | 成人一级毛片 | 中国产一级毛片 | 青青草最新网址 | 在线a毛片免费视频观看 | 国产精品久久久久久久亚洲按摩 | 成人羞羞国产免费游戏 | 国产精品视频成人 | 日本成人一区二区 | 亚洲第一成网站 | 久久免费视频一区二区三区 | 免费观看黄色影片 | 一级黄色国产视频 | 九九热精品在线视频 | 91精品国产91热久久久做人人 | 日韩精品 | 99爱视频在线观看 | 天天躁狠狠躁夜躁2020挡不住 | 国产真实孩交 | 国产精品自在线拍 | 久久久久性 | 91毛片网站 | 黄色一级片免费观看 | 三级国产网站 | 免费观看高清视频网站 | 91网页| 免费黄色在线观看网站 | 精品久久久久久久久中文字幕 | 国产午夜精品在线 | 亚洲欧美国产高清 | 少妇一级淫片免费看 | 激情91| 宅男噜噜噜66国产在线观看 |