排序算法——插入排序

来源:互联网 发布:linux启动mysql244 编辑:程序博客网 时间:2024/05/16 19:11

本人小菜鸟一枚,最近今天准备努力研究一下各种排序算法,并直接写代码实现它,不足之处,欢迎指教,谢谢~

1、插入排序

很简单直接的理解方法,就是像打扑克牌一样,摸牌的时候,手里的牌通常是从小到大排列好的,右手摸起来的牌会从右到左(也可以从左到右)依次比较,然后插入其中。用计算机的思维来理解,我觉得可以分为以下几个步骤

首先,对现有的数组,从左到右,依次选取一个key,做为比较插入的对象;

第二,保证key前面的数都是排好序的;

第三,新来的key插入到前面排列好的序列即可;

文字说起来比较难理解,看图就明白了(图来自算法导论啊)


主要是通过两层循环控制1:外层循环控制key值的移动,内层循环控制与key值比较的数一次变化。下面就上代码了

#include "stdafx.h"#include<iostream>#include<iomanip>#include <iostream>#include <stdio.h>#include <string.h>#include <list>using namespace std;int main(){int data_array[] = {1,2,5,4,2,3,9,7,5,6,8};//待排序的数组int sum = sizeof(data_array) / sizeof(int);//求数组的大小,C++和C#求个数组大小都不一样for (int i = 1; i < sum; i++)//外层循环,控制key的移动,key从第二个元素开始,第一个默认是排好序的,因为就他自己{int key = data_array[i];int j = i - 1;while ((key <= data_array[j]) && (j >= 0))//内层循环,将key值依次与它前面的数进行比较,这里是非降序的排列,因此key不大于该数时,需要将其后移一位{data_array[j + 1] = data_array[j];j--;}data_array[j+1]=key;//注意这里是j+1,因为前面j--不满足条件退出循环,因此这里应该是key值赋到j+1位}for (int k = 0; k < sum; k++)//循环输出排好序的数组{cout << data_array[k];}return 0;}


0 0
原创粉丝点击