堆排序和選擇排序

2022-06-16 20:03:09 字數 3315 閱讀 7959

選擇排序的執行過程為每次迴圈遍歷陣列找出最小(或最大)的數,將其放在陣列的有序數列的最後面,每次第i次遍歷查詢要執行n-i個單位時間,然後要執行n次,故時間複雜度為o(n^2),很簡單,比較適合較小的數列的排序。

選擇排序的**selection_sort.cpp會在下面的完整**中呈現。

而堆排序是對於選擇排序的優化排序,它利用率了最大(最小)堆頂的數最大(最小)的性質,使得找到乙個陣列找到最大(最小)的元素的操作不需要像選擇排序一樣消耗n-i的時間。其時間複雜度為o(nlogn),空間複雜度為o(1)。

在介紹堆排序的執行過程前,先要了解幾個公式:

對於乙個根節點i,其左子樹為2*i+1,其右子樹為2*i+2,而最後乙個有子樹的根節點 a 的位置小於等於 n/2,n是待排序陣列的長度。

出處:

其執行過程如下:

1.先建立最大(最小)堆(build_heap)

1.1 將陣列匯入一顆完全二叉樹;

1.2 從倒數第乙個有子樹的根節點開始建立堆(heapify)(操作就是通過比較和變換使得根節點的大小大於(小於)子樹的大小。),然後對前面乙個根節點做同樣的迴圈操作,直到堆頂也操作結束,則完成建立整個堆。

在heapify的過程中,我們要在改變了乙個子樹跟根節點位置後,再向下調整其子樹的子樹和其子樹的位置,直至最後乙個子樹。

這部分**如下:

void heap_sort::heapify(int array,int i,int n)//

最大堆

else

break

; }

}void heap_sort::build_heap(int array, int

n)}

2. 交換堆頂與堆末尾的數值,並且調整堆的長度後,重新調整成最大(最小)堆,一直迴圈直至堆中只剩乙個堆頂元素。這個過程實際上大部分人已經能理解了。如下圖所示:

最終得到圖如下:

這部分**如下:

void heap_sort::sort_heap(int array, int

n)}

完整的工程**如下:

sort.h

//

自己編寫的各種排序演算法的標頭檔案。

#ifndef _sort_h

#define _sort_h

//氣泡排序

class

bubble_sort;

//歸併排序

class

merge_sort;

//快速排序

class

quick_sort;

//插入排序

class

insertion_sort;

//堆排序

class

heap_sort;

//選擇排序

class

selection_sort;

#endif

heap_sort.cpp

#include "

sort.h

"#define lchild(i) (2*i+1)//

定義對於傳入的根節點算出相應的左子節點

void heap_sort::heapify(int array,int i,int n)//

最大堆

else

break

; }

}void heap_sort::build_heap(int array, intn)}

void heap_sort::sort_heap(int array, int

n)}

selection_sort.cpp

#include "

sort.h

"void selection_sort::sort_selection(int array, int

n)

inttemp;

temp =array[min_location];

array[min_location] =array[i];

array[i] =temp;}}

main.cpp

#include #include 

"sort.h

"using

namespace

std;

void

main()

;

int array2 = ;

int n = sizeof(array) / sizeof(int

);

int n2 = sizeof(array2) / sizeof(int

); heap_sort::sort_heap(array, n);

selection_sort::sort_selection(array2, n2);

cout

<< "

堆排序:

"<

for (int i = 0; i < n; i++)

cout

<< "

選擇排序:

"<

for (int i = 0; i < n; i++)

system(

"pause");

}

執行結果如下:

到此介紹結束,歡迎交流。

出處:

選擇排序(選擇排序和堆排序)

選擇排序 從序列中依次選出最小值 或者最大值 放在一側。這樣的排序叫選擇排序。這裡我們對選擇排序進行優化,一次就選出當前序列的最大值和最小值。分別放在最右端和最左端。然後left right 使得序列範圍縮小,再進行選擇最大和最小值。void selectsort int a,int n 3選擇排序...

選擇排序 選擇排序和堆排序

選擇排序 基本思想 每一趟 第i趟,i 0,1,n 2 在後面n i個待排序的資料元素集合中選出關鍵碼最小的資料元素,作為有序元素序列的第i個元素。待到第n 2趟做完,待排序元素集合中只剩下1 個元素,排序結束。一 選擇排序 每一次在一組數中選最大的放到最後,然後再在剩餘的數中選次大的數放到倒數第二...

選擇排序 (選擇排序和堆排序)

原理 每一次從無序區間選出最大 或最小 的乙個元素,存放在無序區間的最後 或最前 直到全部待排序的資料元素排完 穩定性 不穩定 1.乙個穩定的排序可以變成不穩定的排序 2.乙個本身就不穩定的是不可能變成穩定的 空間複雜度 o 1 時間複雜度 o o n 2 public static void se...