資料結構之排序 選擇類排序

2021-06-19 05:58:23 字數 1442 閱讀 9734

三 選擇類排序

基本思想:從待排數列中選出最小的記錄,放到已排好序的元素之後,直至所有元素排序完畢!

1. 直接選擇排序

初始時:有序區為空,無序區即待排數列

第一趟,從無序區中選出最小的,與無序區的第乙個元素交換。新的有序區多乙個元素,新的無序區少乙個元素,有序區在無序區之前!

第二趟,......

#define swap(a, b) \

do while(0)

void select_sort(int a, int len)

if (i != minindex)

swap(a[i], a[minindex]);

}

}

直接選擇排序是不穩定的,如

時間複雜度為:o(n^2); 如:第i趟選出最小的元素需要進行n - i 次比較。總的比較次數為:n * (n - 1) / 2, 平均時間複雜度為o(n^2)

2. 堆排序

大根堆:根節點的值比其左右孩子的值大的二叉樹。

在堆排序中並沒有用這種樹形結構儲存資料(二叉樹本身的儲存方式就有「陣列,即線性表「方式),只是借用根節點與左右孩子的關係! 即此堆是由待排數列推出來的!

leftchild = i *2; rightchild = i * 2 + 1; (i = 1, 2, 3,....), 且能推出最大的非葉子節點的編號是 size / 2;

堆排序有兩個問題需要解決:

a> 如何建堆!     //待排數列本身就是乙個「二叉樹」, 把它調整成堆即可!從編號最大的非葉子節點入手調整!

b> 如何調整堆!    //根與左右孩子的大小關係,滿足堆的定義

#include #define swap(a, b) \

do while(0)

void heapadjust(int *a, int i, int size) //調整堆

}return ;

}void buildheap(int *a, int size)

void heapsort(int a, int size)

}int main()

; int size = 7;

int i;

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

printf("%d ", a[i]);

printf("\n");

heapsort(a, size);

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

printf("%d ", a[i]);

printf("\n");

return 0;

}

注:堆排序是不穩定排序,其最壞時間複雜度為o(nlgn).堆排序的平均效能接近最壞效能,且建初始堆需要比較的次數較多,故適合元素較少的數列(記錄較少的檔案)!

資料結構之選擇排序

基本方法 從0索引開始,依次和後面元素比較,小的往前放,第一次完畢,最小值出現在了最小索引處,第二次找到第二小的值。具體是如何實現呢?第一輪是0索引上的資料依次跟後面各個索引上的資料進行比較,直到遇到乙個比它小的資料,這時候,這個小的資料就替換掉0索引上原來的資料,接著這個替換掉的資料繼續跟它原來的...

資料結構之選擇排序

選擇排序應該是最容易實現的一種排序方法,其原理很簡單,依舊分為兩塊資料,左邊選取資料與右邊的資料進行比較,取最小值,比較到最後的位置後交換資料,確保每一次比較中最小值都會調整到左邊並有序增加,實質上就是取最小值的函式,只不過外層包了乙個迴圈。void selectionsort int arr,in...

資料結構 排序演算法之選擇排序

一 選擇排序 最差的排序演算法 在選擇排序中,假定我們需要公升序,因此在每次排序中,需要找到最大的元素,將其放在最後,在每一次的迴圈中,都是將最大的元素放在最後,因此對於資料較多的陣列,迴圈的次數將與陣列中元素的個數一致,因此,在對於這種陣列進行排序時,將十分的浪費時間。有關選擇排序的思路,如下所示...