简单选择排序
简单选择排序(Simple Selection Sort)是通过n – i次关键字之间的比较,从n – i + 1个记录中选出关键字最小(大)的记录,并和第i(1≤i≤n)个记录交换。
这种排序算法简单直观,首先从未排序序列中找到最小(大)元素,存放到排序序列的起始位置。然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。
算法实现及测试:
#include <iostream> using namespace std; // 选择排序 void SelectSort(int data[], int count) { int min = 0; int auxiliary = 0; for (int i = 0; i < count; ++i) { min = i; for (int j = i + 1; j < count; ++j) { if (data[j] < data[min]) min = j; } if (i != min) { auxiliary = data[i]; data[i] = data[min]; data[min] = auxiliary; } } } int main() { int array[] = {9, 6, 3, 8, 7, 1, 5, 2, 4}; SelectSort(array, 9); for(int i = 0; i < 9; ++i) cout << array[i] << endl; return 0; }
简单选择排序的比较次数为O(n ^ 2),总的比较次数N = (n-1) + (n-2) + … + 1 = n*(n-1)/2。交换次数为O(n),最好情况是关键字初始有序,交换0次,最坏情况时关键字初始逆序,交换n-1次。简单选择排序的交换次数比冒泡排序少很多,由于交换操作所需的CPU时间比比较操作所需的CPU时间多,所以n值较小时,选择排序要优于冒泡排序。
【学习资料】 《大话数据结构》 《维基百科》