插入排序
来源:互联网 发布:国内餐饮软件排名 编辑:程序博客网 时间:2024/04/30 09:05
插入排序:插入排序是将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增1的有序表;
其主要思路是,将序列的第一个记录看成是一个有序的子序列,然后从第二个记录逐个进行插入,直达整个序列有序;
时间复杂度大概是O(N2);
举个例子就是:
1,2,43,55,40,78,90,8.456
假设按照降序:
插入排序从第二个开始
第一次序列结果是:
2,1,43,55,40,78,90,8,456
第二次是:
43,2,1,55,40,78,90,8,456
第三次是:
55,43,2,1,40,78,90,8,456
详细解析第四次:
第四次指针指向40, 40 与前面排好序的有序列:55,43,2,1,中的最后一个1比较,发现比1大,将40 赋值给哨兵flag,那么将1往后移动,此时序列式55,43,2,1,1 ,40已复制到flag中,然后,将flag 与第四个从左往后比较,如果比flag小,则往后移动,第一次移动情况:
55,43,2,2,1 flag 依旧是40,再和第三个比,发现还是大了,于是记录继续后移:
55,43,43,2,1 flag 依旧是40,在和第二个比,发现合适了,于是,插入到这里:
55,43,40,2,1,
整个过程大概是这样的;
下面给出一个实例:
#include<iostream>using namespace std;#define N 10void Insert_D2(int *a );void Insert_D3(int *a );void SoupSeq(int *b);int Arr[N]= {49,38,1,76,13,27,56,77,11,15};int main(){//SoupSeq(Arr) ;//Insert_D2(Arr);//Insert_D3(Arr);return 0;}//直接插入排序;升序void Insert_D2(int *a){int temp;//哨兵for(int i = 1;i<N;i++){if(a[i]<a[i-1])//如果待插入的比结尾的小{temp = a[i];//将此值付给哨兵;a[i] = a[i-1];//序列扩大一个int j;for(j = i-1;(a[j]>temp) && j>=0;--j) //如果往左边的一个大于哨兵a[j+1] = a[j]; //记录后移a[j+1] = temp;}}}//直接插入排序;降序void Insert_D3(int *b){int temp =0;for(int i = 1;i<N;i++){if(b[i]>b[i-1]){temp = b[i];b[i] = b[i-1];int j = 0;for(j= i-1;j>=0 && b[j]<temp;--j)b[j+1] = b[j];b[j+1] = temp;}}}//最简单的排序void SoupSeq(int *b){int temp;for(int i = 0;i<N;i++){for(int j = i+1;j<N;j++){if(b[i]>b[j]){temp = b[i];b[i] = b[j];b[j] = temp;//下面是不使用临时变量做交换/*b[i] = b[i]+b[j];b[j] = b[i]-b[j];b[i] =b[i] -b[j];*///也可使用未操作来达到交换变量//b[i] = b[i]^b[j];//b[j] = b[j]^b[i];//b[i] = b[i]^b[j];}}}}
0 0
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 并发不是并行 它更好!
- 如何用java语言实现遍历字符串中每个字符出现的次数
- hdu 3535 AreYouBusy dp
- 一个支持大数计算的类型 仅不支持除法
- emacs浏览器配置
- 插入排序
- 【OpenGL】Shader实例分析(五)- 边缘检测
- leetcode-Maximal Rectangle
- 我们仨
- 第四周作业——无向图的DFS算法
- 二分查找
- 从原理出发理解JDK动态代理
- 构建RESTful Web Service - 验证的实现和使用(HTTP 基本认证)
- web开发小技巧:异类的Javascript处理和解析URL的方式