選擇排序與堆排序

2021-07-10 03:17:33 字數 2742 閱讀 4520

選擇排序

依次選擇陣列中的最小值(從小到大),並按順序排放。

從第乙個數開始,依次遍歷陣列中的資料,找出最小值,並與第乙個數交換位置;

從第二個數開始,依次遍歷(剩餘)陣列中的資料,找出最小值,並與第二個數交換位置;

... ...

堆排序

堆的概念:在一顆完全二叉樹中,子結點的值總是小於父結點的值(大根堆),或者子結點的值總是大於父結點的值(小根堆)。

我想,堆排序之所以也屬於選擇排序,是因為它總是從堆中選擇最大值(降序是最小值)交換於資料尾部。

排序過程:

1.我們將陣列「理解(視)為」邏輯中的二叉樹;

例如:int array[10] = ;

層序存放:

2.將二叉樹調整為二叉堆(如果是公升序排列,使用大根堆)

從最後乙個有孩子的結點的位置(node=(length -1)/2)開始,調整「父」與「子」結點的位置(使子結點的值總是小於父結點的值,左右子結點大小無所謂),直到調整至根結點。

調整後的輸出:  

(這裡只是將5和1做了交換)

3.將根結點與尾結點進行交換(此時的尾結點不一定是最小值)

因為此時根結點為最大值,即:將最大值挪動到最後位置,此後不再「關注」。

輸出:  

(這裡將9和0做了交換,9不再參與之後的比較、調整)   

4.(遞迴)重複步驟2  

調整後的輸出:  

5.重複步驟3      

輸出:  

(這裡將8和0做了交換,8不再參與之後的比較、調整)      

6.(遞迴)重複步驟2和3   

最終,得到結果:

對應的陣列array[10] = ;

在理解「堆排序」之前,我有2個疑惑:   

1. 陣列的儲存為什麼不調整為bst樹?   

陣列如果表示為bst的儲存,bst的樹高不確定,將會借助更大的儲存空間;(如果想降低樹的高度,必須旋轉)

2. 如果資料本來就是按照公升序排列(小頂堆),然後又來構建大頂堆,豈不是多此一舉?  

這就是為什麼堆排序的時間複雜度(最小、平均、最大)總是o(nlogn)。

#include//列印

void display(int array, int n)

printf("\n");

}//選擇排序

void selectionsort(int array, int n)

//display(array, n);

} //尋得本輪最小值後,(通過交換)放置到適當的位置。

array[index] = array[i];

//value即當前最小值,把它放置到位置i

array[i] = value;

display(array, n);

}}//堆調整

void heapadjust(int array, int node, int heapsize)

else

if( rightchild <= heapsize && array[rightchild] > array[largest])

//如果最大值不是「結點值」,「結點值」與其孩子中的「大值」交換。

if(largest != node) }

//構建大頂堆,

//如果本來資料就是按照公升序排列,然後又來構建大頂堆,豈不是多此一舉?

void buildheap(int array, int length) }

//堆排序

void heapsort(int array, int length)

display(array, length);

}int main()

; //int array[10] = ;

//int array[10] = ;

selectionsort(array, 10);

printf("**********====test heap sort **********====\n");

int array10[10] = ;

//int array11[10] = ;

//int array12[10] = ;

heapsort(array10, 10);

}

選擇排序與堆排序

首先引入一幅圖對七大基於比較的排序演算法進行瀏覽 一 選擇排序 1 思路 每一次從無序區間選出最大 或最小 的乙個元素,存放在無序區間的最後 或最前 直到全部待排序的資料元素排完。2 具體 實現 選擇排序 public static void selectsort int array private...

選擇排序 直接選擇排序與堆排序

選擇排序即每次從待排序的數列中選擇乙個最小的元素,然後把它放在已排好序列的最前面 假定這裡從小到大排序 直至序列完全有序。選擇排序分為線性結構的直接選擇排序與非線性的堆排序,後者是用相當於把樹的元素存在陣列中,通過元素下標來區分孩子結點與父親結點等等 1.直接選擇排序 直接上 void select...

排序詳解 選擇排序與堆排序

void selectsort int arr,int n int tmp arr i arr i arr min arr min tmp 將陣列第乙個位置賦值給min 用來記錄最小數的位置 將arr min 與後面的元素依次比較直至最後乙個元素,若有比arr min 小的數則將此位置重新賦給min...