选择排序
选择排序是一种比较简单的排序算法,它是一种线性排序算法,通过比较每个位置上的元素和它之后的所有元素来进行排序。
原理
假定现在有一个长度为n的数组{a1,a2,...,an}
1. 从a1开始到an−1,每一个位置上的元素都与它之后的所有元素进行比较,如果比下一位的元素大,就交换两个元素的位置。然后该位置用新元素与之后的元素进行比较。
2. 通过第一次遍历后,最小的数就被筛选出来,放在a1的位置,相当于这个数已经被放在正确的位置上。
3. 排除掉a1,n–,对后面的元素数组排序。
4. 重复前面三步,直到所有的元素都被放在正确的位置上。相当于排除掉已经放在正确位置上的数,对剩下的数组元素做排序。
每一次对剩余每一次遍历可以确定一个数的位置,第n-1次遍历完成之后数组排序完成。
分析
初始数组 {43512}
这里分析第一次排序
- 4 3 比较,完成后 3 4 5 1 2
- 3 5 比较,完成后 3 4 5 1 2
- 3 1 比较,完成后 1 4 5 3 2
- 1 2 比较,完成后 1 4 5 3 2
可以发现第一次的排序就是将最小值1移到最后一位的过程。
代码
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void sort(int* arr, int len)
{
for(int i = 0; i < len - 1; i++) {
for(int j = i + 1; j < len; j++) {
if(arr[i] > arr[j])
swap(arr + i, arr + j);
}
}
}
时间复杂度
n个元素的数组要进行n-1次遍历,每次遍历最多进行的交换次数依次为
n-1 , n-2 , n-3 , …. , 1
将其相加,结果为
∑i=1n−1i=n(n−1)2
所以选择排序的时间复杂度为 O(n2).