選擇排序的執行過程為每次迴圈遍歷陣列找出最小(或最大)的數,將其放在陣列的有序數列的最後面,每次第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)//2. 交換堆頂與堆末尾的數值,並且調整堆的長度後,重新調整成最大(最小)堆,一直迴圈直至堆中只剩乙個堆頂元素。這個過程實際上大部分人已經能理解了。如下圖所示:最大堆
else
break
; }
}void heap_sort::build_heap(int array, int
n)}
最終得到圖如下:
這部分**如下:
void heap_sort::sort_heap(int array, int完整的工程**如下:n)}
sort.h
//heap_sort.cpp自己編寫的各種排序演算法的標頭檔案。
#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
#include "selection_sort.cppsort.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)}
#include "main.cppsort.h
"void selection_sort::sort_selection(int array, int
n)
inttemp;
temp =array[min_location];
array[min_location] =array[i];
array[i] =temp;}}
#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...