演算法基礎:排序演算法:選擇排序
選擇排序是除氣泡排序之外特別容易被理解的排序演算法了,這篇文章介紹一下選擇排序的主要要點和實現。
演算法思路
- 選擇排序和氣泡排序非常相像,都是使用比較和交換作為排序的重要手段,每次外層迴圈得到一個未排序的最小值,將序列分為已排序和未排序兩種。但區別也非常清晰,氣泡排序的交換在內層迴圈進行,選擇排序的交換在外層進行,內層迴圈只需要獲取當次迴圈最小元素的下標。
演算法要點
選擇排序的主要要點如下所示(N個元素,陣列元素從0開始計數):
- 外層迴圈:0 <= i < N - 1 (N-1次迴圈) 遞加方式迴圈即可
- 最小值標誌:在外層迴圈開始設定為當前下標,內層迴圈中確認當前最小元素下標,當前內層迴圈結束後在外層迴圈中判斷是否需要進行交換,定義此變數的好處在於不必在內層迴圈中進行交換。
- 內層迴圈:將內層迴圈中的元素(包括當前元素)逐個與當前外層元素比較,以獲得此次迴圈中的最小元素的下標
- 比較:比較物件為外層迴圈的當前元素和內層迴圈的所有元素
- 交換:在外層迴圈中直接進行當前元素和進行最小元素的交換
模擬實現
void select_sort(int* arr, int num) {
for (int i=0; i<num-1; i++) {
int min_index = i;
for (int j=i; j<num; j++) {
if (arr[j] < arr[min_index]) min_index = j;
}
int tmp = arr[i]; arr[i]=arr[min_index]; arr[min_index]=tmp;
}
}
結果驗證
加上列印和呼叫的示例程式碼,可以使用如下方式進行驗證
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void select_sort(int* arr, int num) {
for (int i=0; i<num-1; i++) {
int min_index = i;
for (int j=i; j<num; j++) {
if (arr[j] < arr[min_index]) min_index = j;
}
int tmp = arr[i]; arr[i]=arr[min_index]; arr[min_index]=tmp;
}
}
void print_array(int* arr, int num) {
for (int i=0; i<num; i++) printf("%d ",arr[i]);
printf("\n");
}
int main() {
int n = 0;
while (scanf("%d",&n) != EOF) {
int* array = (int *)malloc(sizeof(int)*n);
memset(array,0,sizeof(int)*n);
for (int i=0; i<n; i++) {
scanf("%d",&array[i]);
}
select_sort(array,n);
print_array(array,n);
free(array); array= NULL;
}
}
執行結果示例
9
9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9
相關文章
- 排序演算法:選擇排序排序演算法
- 排序演算法__選擇排序排序演算法
- PHP基礎演算法之選擇排序法PHP演算法排序
- PHP 排序演算法之選擇排序PHP排序演算法
- Python排序演算法之 選擇排序Python排序演算法
- 排序演算法入門:選擇排序排序演算法
- 排序演算法之「選擇排序(SelectionSort) 」排序演算法
- 排序演算法 - 氣泡排序和選擇排序排序演算法
- 排序演算法入門之「選擇排序」排序演算法
- 常用演算法-選擇排序演算法排序
- java選擇排序演算法Java排序演算法
- 畫江湖之演算法篇【排序演算法】選擇排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 選擇排序演算法排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 深入淺出的排序演算法-選擇排序排序演算法
- 資料結構與演算法——排序演算法-選擇排序資料結構演算法排序
- go slice/map型別 排序(選擇排序演算法)Go型別排序演算法
- 演算法學習之選擇排序和堆排序:演算法排序
- 【一起學習排序演算法】3 選擇排序排序演算法
- 基礎演算法之排序演算法演算法排序
- 演算法小專欄:選擇排序演算法排序
- 從演算法開始[選擇排序]演算法排序
- 選擇排序-演算法及優化排序演算法優化
- selection_Sort(選擇排序演算法)排序演算法
- 夯實基礎:排序演算法之堆排序排序演算法
- 排序演算法__基數排序排序演算法
- 演算法學習 - 基礎排序演算法演算法排序
- 前端面試題:演算法-選擇排序前端面試題演算法排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- 【小小前端】前端排序演算法第一期(氣泡排序、選擇排序、插入排序)前端排序演算法
- 程式猿修仙之路--演算法之選擇排序演算法排序
- C#實現——十大排序演算法之選擇排序C#排序演算法
- 【小小前端】前端排序演算法第三期(不簡單選擇排序-堆排序)前端排序演算法
- (建議收藏)2020最新排序演算法總結:冒泡、選擇、插入、希爾、快速、歸併、堆排序、基數排序排序演算法
- 常用的排序演算法(五)--選擇排序以及最佳化(PHP實現)排序演算法PHP
- PHP基礎演算法之快速排序法PHP演算法排序
- 演算法基礎 --- 十大排序演算法排序
- 手寫演算法並記住它:選擇排序演算法排序