常考的排序演算法彙總3 簡單選擇排序 堆排序

2021-10-18 07:56:14 字數 2124 閱讀 1554

1.1演算法描述

其基本思想就是:

第一步,在待排序的記錄關鍵字a[1]——a[n]中選擇最小(最大)記錄,將它與a[1]交換;

第二步,在剩下的a[2]——a[n]中選擇最小(最大)的記錄,將它與a[2]交換;

第三步:以此類推,即可得出從小至大(從大至小)的數列。

1.2舉例理解

初始數列:10 50 30 60 70 20

第一趟:選擇數列中最小的數,即10,10在a[1]上,因此不需要交換,即:10 50 30 60 70 20

第二趟:從剩下的數中選擇最小的數,即20,將20與a[2]交換,即:10 20 30 60 70 50

以此類推,得出序列為:10 20 30 50 60 70

1.3**實現

#include

intselectsort

(int a,

int n)}if

(min!=i)}}

intmain()

;printf

("排序前的數列:");

for(i=

0;i<

6;i++

)selectsort

(a,6);

printf

("排序後的數列:");

for(i=

0;i<

6;i++

)return0;

}

堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

2.1演算法描述

第一步:將無序序列構建成乙個堆,自行選擇大頂堆或小頂堆;

第二步:將堆頂元素與末尾元素交換,將最大元素放到陣列末端;

第三步:重複執行第

一、二步,直到整個序列有序。

2.2舉例理解

(以大頂堆為例)

設初始無序序列為:2 6 8 3 7 9 5

對應的堆為:

26 8

3 7 9 5

構造大頂堆為:

9

7 83 6 2 5

即現在序列為:9 7 8 3 6 2 5

將堆頂元素與末尾元素交換,使末尾元素最大,則序列為:5 7 8 3 6 29(此時9為確定序列,此後只對剩下元素排序)

重新調整結構為:

8

7 53 6 29

堆頂元素與末尾元素交換,即現在序列為:2 7 5 3 68 9(此時8和9 都已確定)

重複上述步驟:

最終排序為:2 3 5 6 7 8 9

2

3 56 7 8 9

2.3**實現

#include

int a=

,n=7

;void

exchange

(int i,

int n)

void

heapsort

(int n)

else

printf

("%d %d\n"

,a[1

],a[0]

);return;}

for(i=n/2-

1;i>=

0;i--

) s=a[0]

; a[0]

=a[n-1]

; a[n-1]

=s;printf

("%d "

,a[n-1]

);heapsort

(n-1);

}int

main()

演算法3 排序 簡單選擇排序

基本思想 在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換 然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。選擇排序的思想其實和氣泡排序有點類似,都是在一次排序後把最小的元素放到最前面。但是過程不同,氣泡排序是通過相鄰的比較和交換。而選擇排序是通...

簡單選擇排序演算法

include include include 排序用到的結構和函式 define maxsize 20 typedef struct sqlist 交換l中陣列r的下標為i和j的值 void swap sqlist l,int i,int j 簡單選擇排序 void selectsort sqli...

簡單選擇排序演算法

簡單選擇排序思想 首先,找到陣列中最小的元素,其次,將它和陣列第乙個元素交換位置 再次,在剩下的元素中找到最小的元素,將它與陣列中的第二個元素交換。如此亡故,直到將整個陣列排序。這種方法叫做選擇排序,因為它在不斷地選擇剩餘元素之中的最小者。先說看每步的狀態變化,後邊介紹細節,現有無序陣列 6 2 4...