資料結構 選擇排序

2021-09-20 18:30:53 字數 2966 閱讀 1606

一、簡單選擇排序

更正:

#includeint main()

}if(k!=i)

}printf("the sorted numbers:\n");

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

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

}

演算法分析:從i個記錄中挑選最小記錄需要比較i-1次,對n個記錄進行簡單選擇排序,所需進行關鍵字比較次數總計為:

移動記錄次數,正序為最小值0,反序為最大值3(n-1);

簡單選擇排序最好、最壞、平均時間複雜度都是o(n^2); 

二、堆排序

堆排序

堆排序是利用這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。首先簡單了解下堆結構。

堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖:

同時,我們對堆中的結點按層進行編號,將這種邏輯結構對映到陣列中就是下面這個樣子

該陣列從邏輯上講就是乙個堆結構,我們用簡單的公式來描述一下堆的定義就是:

大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

ok,了解了這些定義。接下來,我們來看看堆排序的基本思想及基本步驟:

堆排序的基本思想是:將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了

步驟一 構造初始堆。將給定無序序列構造成乙個大頂堆(一般公升序採用大頂堆,降序採用小頂堆)。a.假設給定無序序列結構如下

2.此時我們從最後乙個非葉子結點開始(葉結點自然不用調整,第乙個非葉子結點 arr.length/2-1=5/2-1=1,也就是下面的6結點),從左至右,從下至上進行調整。

4.找到第二個非葉節點4,由於[4,9,8]中9元素最大,4和9交換。

這時,交換導致了子根[4,5,6]結構混亂,繼續調整,[4,5,6]中6最大,交換4和6。

此時,我們就將乙個無需序列構造成了乙個大頂堆。

步驟二 將堆頂元素與末尾元素進行交換,使末尾元素最大。然後繼續調整堆,再將堆頂元素與末尾元素交換,得到第二大元素。如此反覆進行交換、重建、交換。

a.將堆頂元素9和末尾元素4進行交換

b.重新調整結構,使其繼續滿足堆定義

c.再將堆頂元素8與末尾元素5進行交換,得到第二大元素8.

後續過程,繼續進行調整,交換,如此反覆進行,最終使得整個序列有序

再簡單總結下堆排序的基本思路:

a.將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;

b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;

c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

#include #include void swap(int *a, int *b) 

void max_heapify(int arr, int start, int end)

}}void heap_sort(int arr, int len)

}int main() ;

int len = (int) sizeof(arr) / sizeof(*arr);

heap_sort(arr, len);

int i;

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

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

printf("\n");

return 0;

}

資料結構 排序 選擇排序

選擇排序 所謂選擇排序,就是不斷從剩下的元素中選擇最小的元素放入前面,那麼 前面 我們就從下標為 0 i 0 的第乙個元素開始 此時我們假設下標為 0 的元素是最小的,minindex 0,minindex 就是最小值的索引 相應的剩下的元素則從 i 1 的位置開始,也就是從 1 開始,然後依次與 ...

資料結構 排序(選擇排序)

排序 選擇排序法 include include include include 選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 ...

資料結構 選擇排序

選擇排序是一種比較直觀的排序方法 選擇排序的思想在於 預設公升序排序 在乙個陣列當中,選擇這個陣列當中最小的元素,將這個元素放在第一位,然後尋找第二小的元素,將這個元素放在第二位。以此類推,直到將這個陣列完成排序。這是乙個比較直觀的排序方法 選擇排序 演算法思想 在遍歷陣列的時候 找出陣列當中最小的...