經典演算法之選擇排序(直接選擇 堆排序)

2021-08-01 22:25:00 字數 1582 閱讀 3337

注:文章**實驗樓

這一章我們來講解選擇排序,首先我們來講解其中最簡單的簡單選擇排序。

簡單選擇排序的基本思想是通過n-1次資料元素的比較,從n-i+1個記錄中選擇最小的資料,並與第i個資料進行交換,如下圖所示。

簡單選擇排序的**實現:

#include 

#include

int n;

/* * 選擇排序

*/void selectsort(int *array)

}if (k != i)

}}int main()

selectsort(array);

printf("排序後為:");

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

printf("\n");

}

通過二叉樹的學習,我們知道堆是完全二叉樹,有最大堆和最小堆,其中最大堆是父結點的值比子結點大,相應的最小堆就是父結點的值比子節點小。

堆排序就是利用了最大堆(或最小堆)堆頂記錄的關鍵字最大(或最小)這一特徵,使得在當前無序區中選取最大(或最小)關鍵字變得簡單。以最大堆為例,它的基本思想就是:

先將初始檔案r[1..n]建成乙個最大堆,此堆為初始的無序區;

再將關鍵字最大的記錄r[1](即堆頂)和無序區的最後乙個記錄r[n]交換,由此得到新的無序區r[1..n-1]和有序區r[n],且滿足r[1..n-1].keys≤r[n].key;

由於交換後新的根r[1]可能違反堆性質,故應將當前無序區r[1..n-1]調整為堆。然後再次將r[1..n-1]中關鍵字最大的記錄r[1]和該區間的最後乙個記錄r[n-1]交換,由此得到新的無序區r[1..n-2]和有序區r[n-1..n],且仍滿足關係r[1..n-2].keys≤r[n1..n].keys,同樣要將r[1..n-2]調整為堆; 重複此操作直到全部有序。

下面是示例圖:

堆排序的**實現:

#include 

#include

int n;

/* * 生成堆

*/void heapadjust(int *array, int s, int m)

if (!(array[0] < array[i]))

array[s] = array[i];

s = i;

}array[s] = array[0];}/*

* 堆排序

*/void heapsort(int *array)

for (i = n; i > 1; i--)

}int main()

heapsort(array);

printf("排序後為:");

for (i = 1; i <= n; i++)

printf("\n");

}

這一章講解了選擇排序中的兩個經典演算法,簡單選擇排序和堆排序,這兩種都是不穩定的演算法。簡單排序的思想是通過n-1次資料元素的比較,從n-i+1個記錄中選擇最小的資料,並與第i個資料進行交換,它的時間複雜度是o(n^2)。堆排序就是利用堆的特徵來進行排序,它的時間複雜度是o(nlogn),相比於快速排序來說,它最大的優點就是在最壞情況下的時間複雜度也為o(nlogn)。

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

思想 一開始整個陣列預設是無序區,有序區元素為空,每趟從無序區裡面選出乙個最小的元素,與無序區的第乙個元素進行交換,整個時候有序區的元素的元素 1,無序區的元素會 1,下一趟排序再從無序區選擇乙個最小的與無序區的元素進行交換,無序區元素 1.有序區 1,以後執行同樣的操作 如下 void selec...

每日演算法 選擇排序演算法之直接選擇排序

1 演算法簡介 選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理如下 2 演算法描述和分析 n個記錄的檔案的直接選擇排序可經過n 1趟直接選擇排序得到有序結果 1 初始狀態 無序區為r 1.n 有序區為空。2 第i趟排序 i 1,2,3.n 1 第i趟排序開始時,當前...

演算法之直接選擇排序

選擇排序的基本思想 每次都從待排序的檔案中選擇出排序碼最小的記錄,將該記錄放於已排序檔案的最後乙個位置,直到已排序檔案記錄個數等於初始待排序檔案的記錄個數字置。這種思路導致的結果便是排出來的序列為從大到小 選擇排序主要分 1.直接選擇排序 2.樹形選擇排序 3.堆排序 直接選擇排序是一種簡單的方法,...