排序算法练习-插入排序

介绍

插入排序是一种时间复杂度为O(n2)级别的排序算法。那么为什么我们还要学习时间复杂度为O(n2)级别的算法呢?因为在有的时候插入排序反而更快,比如对一个近乎有序的数组或者元素值的波动范围比较小的情况下,插入排序有天然的优势。插入排序的思想也可以应用到更高级别的算法中,能够帮助我们进一步优化排序。

具体思路

  • 设定一个索引值 i,索引到第2个元素的位置。
  • 再设定一个索引值 j,使 j = i 。再让当前 j 索引的元素与其前一个元素比较,如果不符合需要排定的顺序,就交换,直到满足需要排定顺序的要求。
  • 以此类推,直到把之后的元素都遍历完。

代码实现

下面用C++实现一个基本的插入排序算法:

#include<bits/stdc++.h>
using namespace std;

template<class T>
void insertionSort(T arr[], int n) {
    //从第二个元素开始
    for(int i = 1; i < n; i++) {
        for(int j = i; j > 0; j--) {
            //依次与前一个元素比较
            if(arr[j-1] > arr[j]) 
                swap(arr[j-1], arr[j]);
        }
    }
    return;
}

int main(int argc, char const *argv[])
{
    // 测试
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    insertionSort(arr, 10);
    for(int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

优化

很多时候我们都需要对我们的代码进行优化,上面的代码也有可以优化的地方。这是我写的一个优化的插入排序。

#include<bits/stdc++.h>
using namespace std;

template<class T>
void insertionSortAd(T arr[], int n) {
    //从第二个元素开始
    for(int i = 1; i < n; i++) {
        //备份当前值
        T temp = arr[i];
        int j;
        for(j = i; j > 0 && arr[j-1] > temp; j--) {
            //当前面的元素不满足排序要求,覆盖到后面的位置,直到满足排序要求
            arr[j] = arr[j-1];
        }
        //此时 j 所在的位置就是temp该在的位置
        arr[j] = temp;
    }
    return;
}

int main(int argc, char const *argv[])
{
    // 测试
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    insertionSortAd(arr, 10);
    for(int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

省去了频繁交换对时间的影响。

最后

  • 由于博主水平有限,难免有疏漏之处,欢迎读者批评指正!
发布了5 篇原创文章 · 获赞 4 · 访问量 152

猜你喜欢

转载自blog.csdn.net/weixin_43587255/article/details/105505666