选择排序,冒泡排序,插入排序

1. 选择排序

排序算法中选择排序应该是最好理解的了吧,

两层循环,外层循环n次,

内层循环从第i个元素后一个元素开始,遇到比当前元素大的就交换数据,

两层循环走完排序就结束了。

时间复杂度为O(n^2)

空间复杂度为O(1)

for(int i = 0; i < len; i++)
{
    for(int j = i+1; j < len; j++)
    {
        if(arr[i]<arr[j])
        {
            int temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
        }
    }
}

2. 冒泡排序

冒泡排序和选择排序有点像,

也是两层循环,外层循环n次,

内层循环从第0个元素到第n-i个元素,只比较相邻的元素,前一个元素更大就交换,

两层循环走完排序就结束了。

时间复杂度为O(n^2)

空间复杂度为O(1)

for(int i = 0; i < len; i++)
{
    for(int j = 0; j < len-i-1; j++)
    {
        if(arr[j]>arr[j+1])
        {
            int temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
        }
    }
}

选择排序的交换次数通常少于冒泡排序,因此在实际使用时速度会稍快。

3. 插入排序

插入排序是将数组分为前面的有序部分后面的无序部分,

外层循环将有序部分长度 i 从 1 到 n-1 ,

内层循环是将有序部分从后往前遍历,所有比 arr[i] 大的都往后移一位,

最后将 arr[i] 插入到第一个比它小的元素后面,

整个过程很像从扑克牌堆中取牌并插入手中的有序扑克序列的过程,

所以被称为插入排序。

void insertionSort(int arr[], int n) {
    int i, j, key;
    for (i = 1; i < n; i++) {
        key = arr[i];        
        j = i - 1;

        // 将 arr[0..i-1] 中比 key 大的元素都向后移动一个位置
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;     // 将 key 插入插入
    }
}

时间复杂度为O(n^2)

空间复杂度为O(1)

虽然时间复杂度和空间复杂度与冒泡排序和选择排序是一样的,

但是插入排序在部分有序的数组比较的次数更少速度更快。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeepLearning_wj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值