插入排序
来源:互联网 发布:淘宝hd注销后无法登陆 编辑:程序博客网 时间:2024/06/15 06:16
0、排序之插入排序
1、作为一个准备报考PAT考试的同学,我认为不会插入排序的写法是可耻的,然而我就是这种可耻的人。于是今天自己实现了一下
2、算法思想
(1)对于程序来说,我们很容易的想到该怎么实现,比如对于下面这样的一串数字
3 1 2 8 7 5 9 4 6 0
如果要是我们使用自己的大脑来对其进行插入排序,我们会很快的实现,但是假若要我们使用算法实现,却始终发现没有那么简单。
插入排序:
1)其实就是从一个杂乱的数组中取出一个数;
2)将这个数放到一个有序的数组中。
(2)实现关键
1)怎么将取出来的数放到已经排好序的序列中,并且形成一个新的有序序列?
这里有两种方法:
第一种,我们将取出来的数字(A)直接放到一个数组中,然后使用sort()直接对其排序,这样就省掉了选择,插入等的困难。但是这种办法不能帮我们提高编码能力,于是有了第二种方法。
第二种
a)我们遍历已经排好序的数组,如果取出来的数大于等于序列的最后一个数,则直接将取出来的数插入到最后一位,并且将新数组的总位数加一。
b)如果不大于,则从新数组中找到第一个比取出来的数小的数B,将其放到数字B的后面。并且将新数组的总位数加一。依次类推,循环step a),b)。直到取到最后一个数。
最后得到新的数组即是排好序的数组。
3、实现代码
#include <stdio.h>#include <algorithm>using namespace std;#define size 101int array[size];//原数组int n ;//使用插入排序void insertSort(){int i ,j ,k=1;//k为数组a的下标int a[size];//暂时存放的数组bool flag = true;a[k] = array[1];//第一项赋值for(i = 2;i<= n;i++){if(array[i] >= a[k]){//如果说大于最后一位 k++;a[k] = array[i]; }else{for(j = 1;j <= k && flag; j++){//先找出恰当的位置,然后插入进去,找到第一个符合条件的位置即可,不一定需要遍历完【重要】 if(array[i] < a[j]){//小于 int m ;for(m = k; m >= j;m--){//往后移一位 a[m+1] = a[m];}a[j] = array[i];flag = false; }}k++;//k加一【重要,不能忘记!】flag = true;}//赋值操作 for(int c = 1;c <= k;c++){array[c] = a[c];}for(int b = 1;b <= n;b++){if(b!=n){printf("%d ",array[b]);}else{printf("%d",array[b]);}}printf("\n");}} int main(){scanf("%d",&n);int i ;for(i = 1;i<= n;i++){scanf("%d",&array[i]);}printf("Isertion Sort\n");insertSort(); }/**103 1 2 8 7 5 9 4 6 0*/
请读者仔细考虑代码注释部分,为实现插入排序的关键地方!
4、实现结果根据结果,可以很清楚的看到,一次次的遍历,一次次的插入。但是我们知道当数组比较小的时候,依次遍历是可行的,假若当数组数目比较大的时候,依次遍历则显得费时,这是则可以使用二分法遍历,找到第一个小于该数A的数B,然后插入即可。
0 0
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 洛谷P1147 连续自然数和
- 洛谷 P3366 【模板】最小生成树
- HTTP Request 和Response
- Python 设置系统默认编码
- HBase 学习笔记
- 插入排序
- 【算法】程序猿不写代码是不对的5
- 数据结构顺序表应用3:元素位置互换之移位算法然而我的思路跟移位没关系
- 内容提供者(ContentProvider)复习
- IOS 将逻辑和视图分开 代码易读性和复用性大大增加
- 第一天,记录一下。
- 图论之图形的表示方法(二)- 相邻表法/邻接表法
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记9
- 比阿里巴巴fastjson更快的解析方法!