C 簡單排序演算法之選擇排序

2021-07-22 13:58:09 字數 2022 閱讀 9397

選擇排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。基於此思想的演算法主要有簡單選擇排序、樹型選擇排序和堆排序。

簡單選擇排序的基本思想:第1趟,在待排序記錄r[1]~r[n]中選出最小的記錄,將它與r[1]交換;第2趟,在待排序記錄r[2]~r[n]中選出最小的記錄,將它與r[2]交換;以此類推,第i趟在待排序記錄r[i]~r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。

以下為簡單選擇排序的儲存狀態,其中大括號內為無序區,大括號外為有序序列:

初始序列:

第1趟:12與49交換:12

第2趟:27不動 :12 27

第3趟:65與38交換:12 27 38

第4趟:97與49交換:12 27 38 49

第5趟:76與65交換:12 27 38 49 65

第6趟:97與76交換:12 27 38 49 65 76 97 完成

選擇排序演算法為乙個不穩定的演算法,因為如果乙個待排的序列有兩個甚至是多個元素相等,而對於我們來說是不期望改變相等元素的位置的,但是快速排序並不能向我們保證這一點

**:

#include 

using

namespace

std;

//exchange the 2 items a and b

void swap(int &a, int &b)

//ergodic the buf and print it

void ergodic(int *p,int length)

}void select_sort(int *p, int length)

}swap(p[index], p[i]);

}}int main(int argc, char *args)

; int m = sizeof(buf);

cout

<< "排序前:"

<< endl;

ergodic(buf,sizeof(buf)/sizeof(int));

//bubblesort(buf, sizeof(buf) / sizeof(int));

select_sort(buf, sizeof(buf) / sizeof(int));

cout

<< "\n\n\n排序後:"

<< endl;

ergodic(buf, sizeof(buf) / sizeof(int));

getchar();

}

執行結果

選擇排序的思想就是在開始進入第一次迴圈時,將第乙個元素的下標賦給index,此時p[index]為第乙個元素,將其與p[j]也就是第二個元素進行比較,如果第二個元素大,則將第二個元素的下標賦給index;也就是說index永遠都是記錄的較大的那個元素的下標,因此 當內層迴圈遍歷結束之後,index為序列中的最大的那個元素的下標,將這個元素與p0交換,這樣最大的元素就排在了最左邊,繼續迴圈,直到所有的數列全部排序完成。

選擇排序與氣泡排序的不同:作為演算法複雜度都為o(n^2)的排序演算法,中心思想都是在第一趟遍歷的過程中就將最大值(或者最小值)找出來。不同的是氣泡排序在每次比較時都將兩個資料進行了交換,而選擇排序只是記錄了較大值的那個下標,在第一趟遍歷結束後才進行交換;這樣看起來氣泡排序比選擇排序多做了很多次交換操作,影響了效率,但是正是由於氣泡排序的種種挨個比較,使得陣列裡的元素永遠不會越過其它的元素進行比較,因此就不會發生改變兩個想等元素的位置這種情況。

所以選擇排序雖然效率稍快,但是不穩定,而氣泡排序效率雖然稍低但確實穩定的排序演算法

從小到大排序:

void swap(int &a, int &b)

void select_sort(int *p, int length)

}swap(p[index], p[i]);}}

簡單排序之選擇排序

口訣 兩兩相比 每輪取最小數交換 外層n 1 內層 i 1 n 優化 相比氣泡排序,雖然比較次數沒變,但是交換次數減少了。package sort 選擇排序 public class selection system.out.println 未排序前 for int i 0 i array.leng...

排序演算法之簡單排序

進入找工作倒計時狀態了,計畫好好複習一下資料結構和相關演算法,估計用兩天時間把見過的排序演算法整理下,首先看一下時間複雜度為o n2 的演算法。首先參考大話資料結構定義乙個鍊錶類 include define maxsize 1000 using namespace std class sqlist...

簡單排序之簡單選擇排序

通過n i次關鍵字間的比較,從n i 1個記錄中選出關鍵字最小的記錄,並和第i 1 i n 個記錄交換之。在排序過程中 相同元素的前後順序並沒有改變,則可認為此排序為穩定排序,反之為不穩定排序。package sorts public class choosesort if min i public...