插入排序

来源:互联网 发布:淘宝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