基本思想
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
代码实现
#include<iostream> using namespace std; /*指定查找范围找出最小值*/ int SelectMinKey(int a[], int n, int i) { int k = i; for (int j = i + 1; j< n; ++j) { if (a[k] > a[j]) k = j; } return k; } void selectSort(int a[], int n) { int key, tmp; for (int i = 0; i< n; ++i) { key = SelectMinKey(a, n, i); //选择最小的元素 if (key != i) { tmp = a[i]; a[i] = a[key]; a[key] = tmp; //最小元素与第i位置元素互换 } } } int main() { int a[8] = { 3,1,5,7,2,4,9,6 }; selectSort(a, 8); for (auto c : a) { cout << c << " "; } cout << endl; }
算法改进:可以一次搜索中同时找出最大值与最小值,能够提高算法的效率
#include<iostream> using namespace std; void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } void SelectSort(int r[], int n) { int min, max, count = 0; for (int i = 1; i <= n / 2; i++) { min = count; max = count; for (int j = count; j < n - count; ++j) { /*查找最大值的索引*/ if (r[j] > r[max]) { max = j; } /*查找最小值索引*/ if (r[j] <r[min]) { min = j; } } swap(r[max], r[n - count - 1]); if (min != n - count - 1)/*避免首尾交换两次*/ { swap(r[min], r[count]); } ++count; } } int main() { int a[8] = { 0,10,-1,7,100,4,9,6 }; SelectSort(a, 8); for (auto c : a) { cout << c << " "; } cout << endl; }