思路:每一趟在n-i+1(i=1,2,3,4 …n-1)个记录中选取关键字最小的记录作为有序序列的第i个记录。
代码如下:
#include <iostream>
#include <assert.h>
using namespace std;
void swap(int *ar, int i, int min)
{
int temp = ar[i];
ar[i] = ar[min];
ar[min] = temp;
}
void SelectSort(int *ar, int len)
{
assert(ar != NULL);
int min = 0;
for (int i = 0; i < len; ++i)
{
min = i; /*将当前下标定义为最小值下标*/
for (int j = i + 1; j < len; ++j)
{
if (ar[min]>ar[j]) /*通过比较找到最小值下标*/
min = j; /*将关键字下标赋值给min*/
}
if (min != i) /*若min!=i,说明有最小值,进行交换*/
{
swap(ar, i, min);
}
}
}
void Print(int *ar, int len)
{
for (int i = 0; i < len; ++i)
{
cout << ar[i] << " ";
}
cout << endl;
}
int main()
{
int ar[] = { 12, 213, 2, 34, 56, 789, 100 };
int len = sizeof(ar) / sizeof(ar[0]);
SelectSort(ar, len);
Print(ar, len);
return 0;
}
时间复杂度为:o(n^2);
空间复杂度为:o(1);
可以看出,尽管与冒泡排序同为o(n^2),但简单选择排序的性能上还是要略优于冒泡排序。