基本思想:先把数列的第一个数当作最小值,保存起来,用最小值和之后的数据比较,小于最小值则替代最小值。
时间复杂度为O(n^2)。
实例:
int arr[] = { 35, 28, 58, 10, 61, 58, 97, 17 };
int k = sizeof(arr) / sizeof(arr[0]);
void simpleSelectSort(int data[], int n)
{
int i, j, k;
int temp;
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j <= n; j++)
if (data[j]<data[k])
k = j;
if (i != k) //第i个元素与第k个元素交换
{
temp = data[k];
data[k] = data[i];
data[i] = temp;
}
}
for (int f = 0; f < n; f++)
{
std::cout << data[f] << " ";
}
}
简单选择排序的优化版:二元选择排序
简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。具体实现如下:
void SelectSort(int r[],int n) {
int i ,j , min ,max, tmp;
for (i=0 ;i <= n/2;i++) {
// 做不超过n/2趟选择排序
min = i; max = i ; //分别记录最大和最小关键字记录位置
for (j= i+1; j<= n-i; j++) {
if (r[j] > r[max]) {
max = j ; continue ;
}
if (r[j]< r[min]) {
min = j ;
}
}
//该交换操作还可分情况讨论以提高效率
tmp = r[i-1]; r[i-1] = r[min]; r[min] = tmp;
tmp = r[n-i]; r[n-i] = r[max]; r[max] = tmp;
}
}