選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始(末尾)位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第乙個[5]與[3]交換,導致第乙個5挪動到第二個5後面)。上面提到了選擇排序是不穩定的排序方法,那我們的氣泡排序是不是穩定的排序方法呢?穩定的意思指的是什麼呢?
判斷某排序演算法是否穩定,我們可以簡單理解成:排序前2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同
如果排序前的陣列是[3,3,1]
,假定我們使用選擇排序的話,那第一趟排序後結果就是[1,3,3]
。這個陣列有兩個相同的值,它倆在array[0]
和array[1]
,結果經過排序,array[0]
的跑到了array[2]
上了。
那麼這就導致:2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序不相同,因此,我們就說它是不穩定的
那麼穩定排序的好處是什麼?
如果我們只對一串數字排序,那麼穩定與否確實不重要,因為一串數字的屬性是單一的,就是數字值的大小。但是排序的元素往往不只有乙個屬性,例如我們對一群人按年齡排序,但是人除了年齡屬性還有身高體重屬性,在年齡相同時如果不想破壞原先身高體重的次序,就必須用穩定排序演算法.很清晰的指出,只有當在「二次」排序時不想破壞原先次序,穩定性才有意義它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始(末尾)位置,直到全部待排序的資料元素排完首先,我們建立陣列,找到它最大的值(這就很簡單了):
int arrays = ;
//假定max是最大的
隨後這個最大的數和陣列末尾的數進行交換:
//使用臨時變數,讓兩個數互換
int temp;
temp = arrays[11];
arrays[11] = arrays[13];
arrays[13] = temp;
那麼經過第一趟排序,我們的最大值已經到了陣列的末尾了。
再次從陣列獲取最大的數(除了已經排好的那個):
再將獲取到的最大值與陣列倒數第二位交換:
temp = arrays[7];
arrays[7] = arrays[12];
arrays[12] = temp;
經過第二次排序,已經能夠將陣列最大兩個數進行排序了
從前兩趟排序其實我們就可以摸出規律了:
第一趟:遍歷陣列14個數,獲取最大值,將最大值放到陣列的末尾[13]
第二趟:遍歷陣列13個數,獲取最大值,將最大值放到陣列倒數第二位[12]
陣列有14個數,需要13趟排序。
//記錄當前趟數的最大值的角標
int pos ;
//交換的變數
int temp;
//外層迴圈控制需要排序的趟數
for (int i = 0; i < arrays.length - 1; i++)
}//交換
c語言實現
int findmaxpos ( int arr, int n)
}return pos;
}void selectionsort ( int arr, int n)
}int main ()
;selectionsort(arr, 9);
for (int i = 0; i < 9; i++)
cout << arr[i] << endl;
}
文章的目錄導航 選擇排序就這麼簡單
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始 末尾 位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動...
氣泡排序就這麼簡單
在我大一的時候自學c語言和資料結構,我當時就接觸到了氣泡排序 當時使用的是c語言編寫的 現在大三了,想要在暑假找到乙份實習的工作,又要回顧一下資料結構與演算法的知識點了。排序對我們來說是一點也不陌生了,當你打王者榮耀的時候也會有段位之分,當你打dota的時候也有天梯分。從高往下數,這個排名是有規律的...
希爾排序就這麼簡單
希爾排序 shell s sort 是插入排序的一種又稱 縮小增量排序 diminishing increment sort 是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因d.l.shell於1959年提出而得名。從上面我們很容易看出來,它是插入排序的高階版 回顧一...