冒泡、选择、插入、二分排序算法
来源:互联网 发布:宋徽宗瘦金体字帖 淘宝 编辑:程序博客网 时间:2024/05/22 03:51
冒泡排序:
首先,冒泡排序又称起泡排序我这里总结了排序两种冒泡排序一种是普通的冒泡排序,一种是优化后冒泡,冒泡排序就是拿第一个数其他所有的数去比较,经过一趟比较把这组数据最大的数据找出来第一次总共要比较(n-1趟),接着又从第一个数开始找第二大的数(n-2趟),以此类推........,
附代码如下:
public void swap(int[]a, int i, int j){int temp = a[i];a[i]=a[j];a[j]=temp;}public void print(int a[]){for(int x:a){System.out.print(x+" ");}System.out.println();} 1.1普通冒泡@Testpublic void bubbleSort(){int a[]={21,25,49,25,16,8};print(a);for(int i=0;i<a.length-1;i++){//趟数:n-1//第i趟//每一趟产生一个最大数放在最后(冒泡): 让第j 和 j+1 个数进行比较,违反需求则交换。j:0~n-i-1for(int j=0; j<a.length-i-1; j++){if(a[j]>a[j+1]){swap(a,j,j+1);}}}print(a);}
所谓优化后的冒泡排序就是,在排序的过程中,发现某一趟的数据都没有交换(实际是已经排序完成了)后面就不需要在排序了
附代码如下:
@Testpublic void bubbleSort2(){int a[]={21,25,49,25,16,8};print(a);for(int i=0;i<a.length-1;i++){//趟数:n-1boolean boo = false;for(int j=0; j<a.length-i-1; j++){if(a[j]>a[j+1]){swap(a,j,j+1);boo=true;}}if(!boo){break;}}print(a);}
选择排序:
这里选择排序我也总结的两种排序算法,一种是普通的选择排序,一种就是有优化后的选择排序,选择排序的思路也比简单,就是每一个数都与其后面的数作比较,这里我就用大家"换手机"为例;
普通的选择排序:
附代码如下:
@Test public void selectSort(){ int a[]={21,25,49,25,16,8,-1,0,23,44}; print(a); for(int i=0;i<a.length-1; i++){//趟数:第i个排 //第i趟:让第i个人依次找他后面的每一个人,如果后者的手机更烂(就把后者的序号k记下,下次用a[k]和后续的人比),依此类推直到最后一个同学 int k=i; for(int j=i+1;j<a.length;j++){ if(a[k]>a[j]){ k=j;//记下当前最小值的序号 } } if(i!=k){ swap(a,i,k); } } print(a); }
优化后选择排序:
附代码如下:
@Test public void selectSort0(){ int a[]={21,25,49,25,16,8,-1,0,23,44}; print(a); for(int i=0;i<a.length-1; i++){//趟数:第i个排 //第i趟:让第i个人依次找他后面的每一个人,如果后者的手机更烂就跟他换,依此类推直到最后一个同学 for(int j=i+1;j<a.length;j++){ if(a[i]>a[j]){ swap(a,i,j);//换手机: 把当前最小值的元素和a[i]交换 } } } print(a); }
插入排序:
插入排序算法就是依次把每个元素拿来插入到有序序列中( 刚开始,第1个元素不要动,可看作已经有序。因此排的时候只考虑第2~n个数,从后插入,一旦前面的数比待插入的数大,就把前面的数往后移动一位.这里我把二分和插入的排序算法结合起来了!
普通的的插入排序:
附代码如下:
@Test public void insertSort(){ int a[]={21,25,49,25,16,8,-1,0,23,44}; print(a); //依次把每个元素拿来插入到有序序列中( 刚开始,第1个元素不要动,可看作已经有序。因此排的时候只考虑第2~n个数 for(int i=0;i<a.length-1;i++){ //待插入的数 int temp = a[i+1]; //下面这段决定temp坐在哪个位置(j+1) 同时 让所有比temp大的数往后挪一个位置 int j=i; while(a[j]>temp){//如果有序序列中"第j位置的数" 比 "temp(待插入的数)" 大,则把a[j]往后挪一个位置 a[j+1]=a[j]; j--; if(j<0){ break; } } //出了该循环,说明temp比a[j]大或者到达左边界(j为-1)。此时temp就坐在a[j+1] a[j+1]=temp;//坐在j的后面 } print(a); }
★二分一定要有序, 如果有序要记得考虑二分
二分法就是把数据分为两段,首先待插入的数与有序中间位置的数比较,则就可以减少一半的比较量,这里我把插入排序算法和二分排序算法结合起来了
附代码如下:
@Test public void insertSort2(){ int a[]={21,25,49,25,16,8,-1,0,23,44}; print(a); //依次把每个元素拿来插入到有序序列中( 刚开始,第1个元素不要动,可看作已经有序。因此排的时候只考虑第2~n个数 for(int i=0;i<a.length-1;i++){ //待插入的数 int temp = a[i+1]; //用二分来找出将要插入的位置:high+1 int low = 0; int high = i; int mid;//中间位置 while(low<=high){ mid = (low+high)/2; if(a[mid]>temp){//temp落在左区 high = mid-1; }else{//temp落在右区 low = mid+1; } }//出循环,low是错的--不应该跑到high的后面 //把该位置(high+1)腾出来,即把high+1及其后面的元素依次往后挪一个位置 //注意,要倒着移动 for(int j=i;j>high;j--){ a[j+1]=a[j]; } //出了该循环,说明temp比a[j]大或者到达左边界(j为-1)。此时temp就插入到a[j+1] a[high+1]=temp;//放在j的后面 } print(a); }
阅读全文
1 0
- 冒泡、选择、插入、二分排序算法
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 基本排序算法(选择,冒泡,一般插入,二分插入)源码
- Java冒泡,快速,插入,选择排序^_^+二分算法查找
- 冒泡选择插入排序算法
- 选择-冒泡-插入排序算法
- 算法--插入选择冒泡排序
- 排序算法(选择、希尔、二分插入、冒泡、直接插入、快速排序)
- 插入,冒泡,选择,快速排序,二分查找
- 二分,插入,选择,冒泡,希尔排序
- 排序----冒泡,选择,插入,二分查找
- 三种数组排序算法(冒泡排序、选择排序、插入排序、二分查找法)
- 第九讲 数组排序算法:冒泡排序、选择排序、插入排序及二分查找技术
- 【算法】插入排序/冒泡排序/选择排序
- 《算法》选择排序、插入排序、冒泡排序
- Java数据结构算法之选择排序、插入排序、冒泡排序、二分查找
- STL学习笔记7— —容器set和multiset
- C语言详细入门指南
- c语言简单实现三子棋(五子棋)
- java获取jpg图片信息-有损JPG图片处理
- bootstrap 公用导航栏添加active
- 冒泡、选择、插入、二分排序算法
- Oracle 错误ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务 ORA-01033:ORACLE initialization or shutdown in progress
- layer实现删除确认及操作完成后弹出提醒,然后刷新本页面
- zookeeper配置
- CodeBlocks在win7终端输出中文乱码的解决方法
- 优雅的为RecyclerView添加头尾布局HeaderAndFooterWrapper
- OpenCV的imshow无法正常显示图片
- JSP中的EL表达式详细介绍
- 常用机器学习算法【一】