关于排序的一点点东西(1)

本文介绍了两种常见的排序算法——选择排序和冒泡排序。详细解析了它们的时间复杂度、空间复杂度及稳定性,并提供了具体的代码实现。

写在前面

最近复习算法的东西。于是在网上查找相关资料,重新了解下几种常见的排序算法。(表格中空白的地方,待了解到那里来的时候再填上?)

时间复杂度和空间复杂度概念就不用解释了,稳定性这个东西已经忘记是什么了(算法老师不要打我)。看看了资料,原来说的是:排序前两个相等的数据在序列中的顺序与排序后的顺序相同。

一、选择排序

简单的说就是每次都去查找数组中最小的指放在最前面。看了下面这个动图应该就一目了然了。

图片来源 维基百科
代码实现为
void selectionSort(int arr[], int len)
{
    for (int i = 0 ; i < len - 1 ; i++)
    {
        int min = i;
        for (int j = i + 1; j < len; j++)     
            if (arr[j] < arr[min])    
                min = j;
        int temp = arr[min];
        arr[min] = arr[i];
        arr[i]=temp;
    }
}
复制代码

这个排序要进行2次循环,所以时间复杂度为O(n²),并没有开辟新的存储空间,所以空间复杂度为O(1)。这种排序是不稳定的,在交换的时候,有可能会更改2个相同数据的位置。比如[5(1),5(2),1]这样一个数组。在进行遍历的后就会变成[1,5(2),5(1)]第1个5就被交换到了第2个5的后面。

二、冒泡排序

冒泡排序就是比较相邻的两个数,如果顺序错误就交换一下。这样就不停的把大的数往后面送,然后从数组的末尾到头部依次排好序。由于冒泡排序只是相邻的两个数相交换,所以这个排序算法是稳定的。

void bubbleSort(int arr[],int len)
{
    for (int i=0; i<len - 1; i++) {
        for (int j=0; j<len-1-i; j++) {
            if (arr[j]>arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
}
复制代码

举个例子:
arr = [6, 1, 5, 3, 7] 第一次外循环

变化交换
( 6 1 5 3 7 ) → ( 1 6 5 3 7 )6 > 1 交换位置
( 1 6 5 3 7 ) → ( 1 5 6 3 7 )6 > 5 交换位置
( 1 5 6 3 7 ) → ( 1 5 3 6 7 )6 > 3 交换位置
( 1 5 3 6 7 ) → ( 1 5 3 6 7 )6 < 7 位置不变

第二次外循环(除开最后一个元素8,对剩余的序列)

变化交换
( 1 5 3 6 7 ) → ( 1 5 3 6 7 )1 < 5 位置不变
( 1 5 3 6 7 ) → ( 1 3 5 6 7 )5 > 3 交换位置
( 1 3 5 6 7 ) → ( 1 3 5 6 7 )5 < 6 位置不变

第三次外循环

变化交换
( 1 3 5 6 7 ) → ( 1 3 5 6 7 )1 < 3 不变
( 1 3 5 6 7 ) → ( 1 3 5 6 7 )3 < 5 不变

第四次外循环(最后一次)

变化交换
( 1 3 5 6 7 ) → ( 1 3 5 6 7 )1 < 3 不变

下次再见...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值