选择排序
时间复杂度:最坏O(n^2) 平均O(n^2) 最好O(n^2)
空间复杂度:O(1)
稳定性:稳定
数据敏感:不敏感
#include<stdio.h>
//升序
void selectSort(int* arr,int size) {
for (int i = 0; i < size - 1; i++) {
//start表示未排序的最左边元素位置
int start = i;
//min表示最小值位置
int min = start;
//循环在未排序里边找最小值
for (int j = start + 1; j < size; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
//找到就把最小值放到未排序的最左边,然后开始下一轮
int tmp = arr[start];
arr[start] = arr[min];
arr[min] = tmp;
}
}
int main() {
int arr[10] = { 1,9,5,3,6,4,4,7,10,2 };
selectSort(arr, 10);
for(int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
优化后的版本:
void selectSort2(int* array, int n)
{
int begin = 0;
int end = n - 1;
while (begin < end)
{
//每一次选择最大值和最小值
int min = begin, max = begin;
for (int i = begin + 1; i <= end; ++i)
{
if (array[i] >= array[max]) // 100 3 5 100 10
max = i;
if (array[i] < array[min])
min = i;
}
//最小值放在begin
Swap(array, begin, min);
//如果最大值位置发生了变化,需要更新
if (max == begin)
max = min;
//最大值放在end
Swap(array, end, max);
/*
Swap(array, max, end);
if (min == end)
min = max;
Swap(array, min, begin);
*/
++begin;
--end;
}
}