【经典算法】:插入排序的实现,通过交换,与众不同!

前言

在我的博客里面,我前面写了一篇关于插入排序的实现报告,这篇报告中规中矩,就是最基本的那种插入排序,一个函数起码也得写的估计有20多行代码,然后今天突然灵感一来,发现一种更加高效的方法,然后撰一篇文以记之,希望大家能够喜欢。
附上我的上篇插入排序博文链接:
http://blog.csdn.net/qq_23100787/article/details/48159551

介绍

插入排序无非就是这样的,序列分为无序和有序的序列,每次从无序的序列找出第一个,然后插入进有序的序列,这样有序的序列长度就会增加,无序的序列长度就会减少,然后最后如果有序序列的长度等于数组长度,说明排序完成。

这里最常用的方法插入进去,就是通过在有序序列里查找后面想插入进来的那个无序数,找到位置后然后通过移位把这个数插入进去,而上篇博客用的就是这种方法。

这篇文章介绍一个新方法

那就是想象前a[0]到 a[j-1]个数都是有序的,然后a[j]个数如何插入进来,这里采用了这种方式,这里默认序列是从小到大排列的。
做一次循环for(j=i-1;j>=0 &&a[j]>a[j+1];j–) 如果满足a[j]>a[j+1],就把这两个数进行交换,假设从第一个考虑起,就是有序的最后一个大于新插入的,这时候不知道前面还有没有比新插入的大的,因此要继续循环,然后交换,直到找到前面序列不比他大的,这样就可以停止循环了,并且这种情况就能达到想要的有序状态

文字说的很模糊,但是我又不会画图,所以这里需要自己去画个图去好好想想,是可以做到的 = =

最后就附上代码和运行截图吧~

代码

// 插入排序
#include <iostream>
using namespace std;
void insert(int a[],int n){
    for(int i=1;i<n;i++){
        for(int j=i-1;j>=0 &&a[j]>a[j+1];j--){
            swap(a[j],a[j+1]);
        }
    }
}
void swap(int *a,int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main(){
    int a[] = {2,7,8,9,3,6,5,1};
    insert(a,8);
    for(int i=0;i<8;i++){
        cout<<a[i]<<" ";
    }
}

这里代码就20行左右,大大减少了代码量 = =,这种通过交换实现的插入排序也是很不错的~

运行截图

这里写图片描述

原来序列是无序的,现在已经达到了有序状态,说明功能完成了 = =

ok~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值