java实现常见排序(选择,冒泡,插入,快速,希尔,堆)
来源:互联网 发布:linux find 命令 编辑:程序博客网 时间:2024/06/06 00:07
选择排序
定义一个的标志位temp,默认为比较的第一个数的下标,分别与后面的数进行比较,若比比较的数字大,则把该数的下标赋给temp,循环一次结束后判断temp的值,若temp值跟第一个数的下标不一样,则把第一个数跟下标为temp的值交换,若temp值一样,则说明后面的数字都比第一个数大,则不交换,继续下一次循环,以此类推,直到循环结束,具体实现的代码如下:
public class Main { public static void main(String[] args) { int array[] = new int[]{2,4,6,8,1,3,5,7,10,9}; int index,current; for(int i=0;i<array.length-1;i++){ index=i; for(int j=i+1;j<array.length;j++){ if(array[index]>array[j]){ index = j; } } if(index!=i){ current = array[i]; array[i] = array[index]; array[index] = current; } } }}
冒泡排序
冒泡排序,有一个口诀"大数沉底,小数往上飘",可见,冒泡排序每一次找出的都是当前需要排列的数字中的最大的那个值,那样当所有的数都遍历过后,也就从小到大排好了序,具体实现如下:
public class Main { public static void main(String[] args) { int array[] = new int[]{2,4,6,8,1,3,5,7,10,9}; int temp; for(int i=0;i<array.length;i++){ for (int j=0;j<array.length-1;j++){ if(array[j]>array[j+1]){ temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } }}
插入排序
插入排序,可以简单理解为在打扑克,每次拿到一张新的牌子都会对手中的牌子做比较,找到对应该牌的位置后插入,那样在手中的牌子则一直是排好序的。具体到数组中的话,把数组第一位数当作手中的牌,后面的数则是要插入的数字,插入排序最坏的运行时间是O(n2)。具体代码实现如下:
public class Main { public static void main(String[] args) { int array[] = new int[]{2,4,6,8,1,3,5,7,10,9}; int current,temp; //除去第一个数,后面均是要插入的数 for(int i=1;i<array.length;i++){ current = array[i]; //要插入的数 temp = i; //记录插入数的位置 for(int j=i-1;j>=0;j--){ if(array[j]>current){ array[j+1] = array[j]; temp --; } } array[temp] = current; } }}
快速排序
快速排序采用了"二分"的思维。选用一个数作为基数(一般是数组中的第一个数),从右往左找小于基数的数i,从左到右找大于基数的数j,若i!=j,则交换两个数,若i==j,则退出当前循环,且array[i]与基数进行交换。这样通过基数就形成了两个区间,再重复以上操作,直到区间只剩下一个数字为止,最终实现小的数在基数的左边,大的数在基数的右边。具体实现代码如下:
public class Main { public static void main(String[] args) { int array[] = new int[]{2,4,6,8,1,3,5,7,10,9}; quickSort(array,0,array.length-1); for (int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } } public static void quickSort(int[] array,int low,int high){ if(low<high){ int middle = sortUtil(array,low,high); //左边排序 quickSort(array,low,middle-1); //右边排序 quickSort(array,middle+1,high); } } public static int sortUtil(int[] array,int low,int high){ int temp = array[low]; while(low<high){ //找到比temp要小的值,交换 while (low<high && array[high]>temp){ high--; } array[low] = array[high]; //找到比temp要大的值,交换 while (low<high && array[low]<temp){ low++; } array[high] = array[low]; } array[low] = temp; return low; }}
希尔排序
希尔排序沿用了插入排序的原理,同时也有"二分法"的思想在里面。先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。其中,以增量d一般为待排序的序列长度的一半。
public class Main { public static void main(String[] args) { int array[] = new int[]{2,4,6,8,1,3,5,7,10,9}; int j,temp; for (int length=array.length/2; length>0; length/= 2) { for (int i=length; i<array.length; i++) { temp=array[i]; for (j=i-length;j>= 0;j-=length) { if (temp<array[j]) { array[j+length]=array[j]; } else { break; } } array[j + length] = temp; } } }}
堆排序
堆排序的基本思想是将待排序的序列构造成一个大顶堆(从上往下,从左往右数字逐渐减小)。此时,整个序列的最大值就是堆顶的根节点。将它与堆数组的末尾元素交换,此时末尾元素就是最大值,然后将除去末尾元素的剩余的 n-1 个序列重新构造成一个堆,这样就会得到 n 个元素中次大的值。如此反复执行,便能得到一个有序序列了。
public class Main { public static void main(String[] args) { int array[] = {2,4,6,8,1,3,5,7,10,9}; int i,temp; for (i = array.length / 2 - 1; i >= 0; i--) { // 构建一个大顶堆 adjust(array, i, array.length - 1); } for (i = array.length - 1; i >= 0; i--) { // 将堆顶记录和当前未经排序子序列的最后一个记录交换 temp = array[0]; array[0] = array[i]; array[i] = temp; // 将array中前i-1个记录重新调整为大顶堆 adjust(array, 0, i - 1); } } public static void adjust(int[] array, int i, int len) { int temp,j; temp = array[i]; for (j = 2 * i; j < len; j *= 2) { if (j < len && array[j] < array[j + 1]){ ++j; } if (temp >= array[j]){ break; } array[i] = array[j]; i = j; } array[i] = temp; }}
阅读全文
0 1
- java实现常见排序(选择,冒泡,插入,快速,希尔,堆)
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
- 常见排序算法C++实现(冒泡,直接插入,希尔,堆,归并,简单选择,快排)
- Java-十种内部排序实现(选择,冒泡,插入,希尔,堆,归并,快速,基数,计数,桶)及代码下载
- Java语言实现九大排序算法(快速、归并、堆、选择、插入、计数、基数、希尔、冒泡)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- java插入,希尔,快速,冒泡,选择排序
- Java基础篇之----排序(快速排序、冒泡排序、堆排序、简单选择排序、 希尔排序、直接插入排序)
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现(14/8/3更新加入二分排序)
- 常见排序方法(冒泡排序、选择排序、插入排序、希尔排序和快速排序)
- C++实现直接插入排序,折半插入排序,希尔排序,冒泡排序,简单选择排序,快速排序,堆排序
- 数组排序(插入、选择、希尔、堆、归并、快速、冒泡)
- C 各种排序(选择/冒泡/快速/插入/希尔/归并/堆)
- 22.冒泡,选择,插入,希尔,快速,堆排序
- Coursera deep learning 吴恩达 神经网络和深度学习 第三周 编程作业 Planar data classification with one hidden layer
- 天天学Linux命令19--locate 命令
- 什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI
- Java List<对象>去重
- 如何理解js中的call和apply
- java实现常见排序(选择,冒泡,插入,快速,希尔,堆)
- poj3243:Clever Y(BSGS)
- 外卖小程序设置起送费,配送费和送达时间-微信小程序教程31
- Git连接GitHub,上传项目
- Simditor编辑器 SpringMVC上传图片
- 点餐界面两个ListView联动效果
- C#构造函数、操作符重载以及自定义类型转换
- CGI,FastCGI,PHP-CGI与PHP-FPM
- Unity3D_直线运动