选择排序

选择排序

选择排序是一种比较简单的排序算法,它是一种线性排序算法,通过比较每个位置上的元素和它之后的所有元素来进行排序。


原理

假定现在有一个长度为n的数组{a1,a2,...,an}
1. 从a1开始到an1,每一个位置上的元素都与它之后的所有元素进行比较,如果比下一位的元素大,就交换两个元素的位置。然后该位置用新元素与之后的元素进行比较。
2. 通过第一次遍历后,最小的数就被筛选出来,放在a1的位置,相当于这个数已经被放在正确的位置上。
3. 排除掉a1,n–,对后面的元素数组排序。
4. 重复前面三步,直到所有的元素都被放在正确的位置上。相当于排除掉已经放在正确位置上的数,对剩下的数组元素做排序。

每一次对剩余每一次遍历可以确定一个数的位置,第n-1次遍历完成之后数组排序完成。

分析

初始数组 {43512}
这里分析第一次排序

  1. 4 3 比较,完成后  3  4  5  1  2
  2. 3 5 比较,完成后  3   4  5 1  2
  3. 3 1 比较,完成后  1  4  5  3  2
  4. 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=1n1i=n(n1)2

所以选择排序的时间复杂度为 O(n2).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值