插入排序算法 (一般 折半 shell)
来源:互联网 发布:疯狂java 编辑:程序博客网 时间:2024/06/16 03:09
1:一般插入排序
先假设第一个元素是有序的,然后在剩下的区域里进行排序,在第二个开始,对于每一个往前扫描,看看适合它插入的位置,时间复杂度n*n,空间复杂度1
因为时间复杂度的限制,导致一般插入排序只能处理数据比较小的序列,当数据范围比较大时,就不行了,大概1000个数可以处理
代码
void yibaninsertion(int a[],int s){ for(int i=1; i<s; i++) { int j=i; while(j>0&&(a[j]<a[j-1])) { swap(a[j],a[j-1]); j--; } } for(int i=0; i<s; i++) { cout<<setw(3)<<a[i]; } cout<<endl;}
2:折半插入排序
折半排序对比与一般排序在时间复杂度上其实是相同的,只是在查找插入点的时候因为是二分查找,所以可能节约了查找插入点的时间,但是移动次数并没有改变
void zhebaninsertion(int a[],int s){ for(int i=1; i<s; i++) { int low=0; int high=i-1; int sentry=a[i]; while(low<=high) { int mid=(low+high)/2; if(sentry<a[mid]) { high=mid-1; } else low=mid+1; } for(int j=i-1; j>=high+1; j--) { swap(a[j],a[j+1]);//a[j+1]=a[j]; } a[high+1]=sentry; } for(int i=0; i<s; i++) { cout<<setw(3)<<a[i]; } cout<<endl;}
3:希尔排序
对于给定的序列,选择一个小于n的整数dist将需要排序的元素分成若干组子序列,,所有距离为dist的元素在同一个组内,然后对各组内的元素进行插入排序,这一趟的排序可以导致每一组的元素都是有序的
然后减少dist的值,并且不断地进行分组和排序,重复这样的操作,当dist=1.即所有组的元素都是有序的,也就是整个数列都是有序的
它的时间复杂度与dist有关,当增量为1时,时间复杂度为n*n,但是在某些序列的情况下最有复杂度可以达到n*(3/2);
代码:
void shellinsertion(int a[],int s){ int dist=s/2; while(1<=dist) { for(int i=dist; i<s; i++) { int j; int sentry=a[i]; for( j=i-dist; j>=0&&sentry<a[j]; j-=dist) { swap(a[j],a[j+dist]); } a[j+dist]=sentry; } dist/=2; } for(int i=0; i<s; i++) { cout<<setw(3)<<a[i]; } cout<<endl;}
对于插入排序,是一种简单的排序方法,它的基本思想是每次将一个待排序的数据对象按照关键字的大小插入到一个有序的序列中,得到一个新的容量增加1的有序数据序列,如此的反复操作,知道全部的对象都插入完毕。
0 0
- 插入排序算法 (一般 折半 shell)
- 排序算法--插入排序(直接插入排序、折半插入、shell排序)的java实现
- 插入排序-(直接插入、折半插入、Shell排序)
- 折半插入排序算法
- 折半插入排序算法
- 折半插入排序算法
- 折半插入排序算法
- 折半插入排序算法
- 折半插入排序算法
- 基本排序(二)插入排序(直接插入、Shell、折半)
- 排序算法------折半插入排序
- 【排序算法】折半插入排序
- 【排序算法】折半插入排序
- 排序算法之二分法(折半)插入排序算法
- 插入排序算法-折半插入排序
- 插入排序----折半插入排序算法
- java折半插入排序算法
- 折半查找插入排序算法
- 利用AWS免费EC2搭建加密代理
- Java中-classpath和路径的使用
- Qt单选框
- JavaScript跨域总结与解决办法
- mknod命令 来自: http://man.linuxde.net/mknod
- 插入排序算法 (一般 折半 shell)
- gradle 构建java应用 使用笔记
- servlet 工作原理
- osg窗口的创建(一)
- Java 使用Calendar 工具类时 设置时区
- linux yum命令详解
- Hadoop入门之Hadoop-2.5.0源码编译
- Swift - 如何连续dismiss 2个VC视图控制器(以及直接跳回根视图)
- 2017 年你应该学习的编程语言、框架和工具