算法复习2-3种初级排序
2016-03-06 19:39
375 查看
1.选择排序:首先找到数组中最小的那个元素,其次将它和数组第一个元素交换位置,再次,在剩下的元素中寻找最小的元素,将它与数组第二个元素交换。直到整个数组排序完毕。
2.插入排序:从数组的开头开始,依次比较现有值与它前一位值的大小,然后进行交换,这样到数组尾执行完交换后,数组就排序完毕了。
3.希尔排序:希尔排序是插入排序的升级版,因为大规模的插入排序效率很低,他只能一次次地让更小的元素向前移动,希尔排序为了加快速度,采用了交换不相邻元素以对数组进行局部排序。并最终用插入排序将局部有序的数组排序。主要思想是使得数组中间隔为h的元素都是有序的,成为h有序数组,用插入排序对h个子数组进行排序,让h每次排序之后不断缩小再进行排序,当h为1时,数组有序。
public void Selection(int[] a) { int N=a.length(); for(int i=0;i<N;i++) { int min=i; for(int j=i+1;j<N;j++) { if(less(a[j],a[min])) min=j;{ exch(a,i,min); } } public bool less(int a,int b) { if(a<b) return true; else return false; } public void exch(int[] a,x,y) { int temp=0; temp=a[x]; a[x]=a[y]; a[y]=temp; }
2.插入排序:从数组的开头开始,依次比较现有值与它前一位值的大小,然后进行交换,这样到数组尾执行完交换后,数组就排序完毕了。
public void Insertion(int [] a) { int N=a.length(); for(int i=0;i<N;i++) { for(int j=i;j>0&&if(less(a[j],a[j-1]);j--) exch(a,j,j-1); } } public bool less(int a,int b) { if(a<b) return true; else return false; } public void exch(int[] a,x,y) { int temp=0; temp=a[x]; a[x]=a[y]; a[y]=temp; }
3.希尔排序:希尔排序是插入排序的升级版,因为大规模的插入排序效率很低,他只能一次次地让更小的元素向前移动,希尔排序为了加快速度,采用了交换不相邻元素以对数组进行局部排序。并最终用插入排序将局部有序的数组排序。主要思想是使得数组中间隔为h的元素都是有序的,成为h有序数组,用插入排序对h个子数组进行排序,让h每次排序之后不断缩小再进行排序,当h为1时,数组有序。
public void Shell(int[] a) { int N=a.length; int h=1; while(h<N/3) h=3*h+1;//+1保证最后h变为1 while(h>=1) { for(int i=h;i<N;i++) for(int j=i;j>=h&&less(a[j],a[j-h]);j-=h) exch(a,j,j-h); h=h/3; } public bool less(int a,int b) { if(a<b) return true; else return false; } public void exch(int[] a,x,y) { int temp=0; temp=a[x]; a[x]=a[y]; a[y]=temp; }
相关文章推荐
- 使用TFHpple解析html
- Android学习之解决多个Fragment切换时重新实例化的问题
- bzoj1211树的计数
- iOS网络基础(1) — TCP、UDP、URL和HTTP
- Linux基础——bash基础应用及文件系统基础命令
- git rebase
- Redis介绍
- #ifdef,#else,#endif,#if用法详解
- socket阻塞与非阻塞,同步与异步、I/O模型
- UWP 程序标题栏设置
- poj 1276 多重背包+二进制
- HDU 4902 Nice boat(线段树)
- 部分数据前台显示为null
- 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)
- 四则运算
- hello c world
- HUST 1601 Shepherd
- Java多线程学习(四)
- 有序数组合并
- 树莓派新版系统上使用mjpg-streamer获取USB摄像头和树莓派专用摄像头RaspiCamera图像