排序算法总结 java实现
2016-03-13 10:57
453 查看
/* Date类用来定义数据,其中比较的是date,依次是 排序, 冒泡排序 选择排序 快速排序 直接插入排序 */ //用来定义数组 class Data implements Comparable<Data>{ int data ; String flag ; //构造数据的方法 public Data(int a ,String flag){ this.data = a; this.flag = flag ; } //重写toString()方法 public String toString(){ return data + flag ; } //重写比较的方法 public int compareTo(Data d){ if(this.data > d.data ){ return 1; } if(this.data == d.data){ return 0; } else{ return -1 ; } } } //排序 public class AllSort{ //shell 排序 public static void shellSort(Data[] data){ System.out.println("开始排序:"); //lenth 用来记录数组的长度 int length = data.length ; //h 表示每次间隔的增量,公式是h=3*h+1 ;所以是从1,4,13,40 //反过来就是h=(h-1)/3; 序列是:40,13,4,1 int h = 1; while(h <= length/3){ h = h*3 + 1 ; } while(h > 0){ System.out.println("====h=:"+ h + "====" ); for(int i = h; i < length ; i++){ //记录当前h 下的值 Data tmp = data[i] ; //当当前值和前退h 的值进行比较,要是小则交换。 if(data[i].compareTo(data[i-h]) < 0){ int j = i -h ; for( ; j>= 0 && data[j].compareTo(tmp) >0 ;j-=h) { data[j + h] = data [j]; } data[j+h] = tmp ; } System.out.println(java.util.Arrays.toString(data)); } h = (h -1) / 3 ; } } //直接插入排序,就想接扑克,假如手中有一张牌,则第二张和第一张比较,加入前面以有多张排序的,则依次后移,在合适的位置加入当前的tmp public static void insertSort(Data [] data){ System.out.println("开始排序:"); //lenth 用来记录数组的长度 int length = data.length ; //从第二张开始接 for(int i = 1; i < length ; i++){ Data tmp = data[i] ; //如果当前的小于前一个,则向后移 if(data[i].compareTo(data[i-1]) < 0){ int j = i -1; //整体向后移 for( ; j >= 0 && data[j].compareTo(tmp) > 0 ;j--){ data[j+1] = data[j]; } //上层循环结束后是j=-1,所以下一个tmp 时要加上1.等于0. data[j+1] = tmp ; } System.out.println(java.util.Arrays.toString(data)); } } //快速排序,假设以第一个数为起点,i,j分别记录下标,i从前往后,记录大于第一个数的下标,J从后往前,记录第一个小于第一个数的下标 //循环一次,则比第一个大的在后边,比第一个小的在前面,在这里会用到一个交换数组元素的方法,swap(data,int i,int j); public static void swap(Data data[] ,int i,int j){ Data tmp ; tmp = data [i]; data[i] = data [j]; data[j] = tmp ; } //快速排序的函数 public static void subSort(Data [] data ,int start ,int end){ if(start < end){ //以第一个元素作为分界 Data base = data [start]; //从0,和最后一个数+1开始,是因为下边用的是++i,--j int i = start ; int j = end+1 ; while(true){ //data[1]<=data[0],则继续i++,直到找到i> data[0]; while( i < end && data[ ++i].compareTo(base) <= 0); //从最后一个数往前找,找到那个小于的才返回 while(j > start && data[--j].compareTo(base) >=0); if( i < j){ swap(data ,i ,j); } //当i>j时,说明前面的以及是有序,不需要在交换 else{ break; } } swap(data ,start ,j); //递归遍历左子树 subSort(data,start,j-1); subSort(data ,j+1 ,end); } } //递归调用的函数 public static void QuickSort(Data data[]){ subSort(data,0,data.length-1 ) ; } //冒泡排序,0,1 1,2, 2,3 依次比较,循环一次会将最大的排在最后 public static void BubbleSort(Data [] data){ System.out.println("开始排序:"); int length = data.length ; //i<length-1,是因为最后一个i应该是倒数第二个后最后一个比,j<length-1-i,是因为这里比较的是j he j+1. for(int i = 0; i < length-1; i++){ boolean flag = false ; //注意这一个j是一个内循环,从0--最后,比较也是连续的,所以不能从i+1开始。 for(int j = 0; j < length-i-1; j++){ if(data[j].compareTo(data[j+1]) > 0){ Data tmp = data[j+1] ; data[j+1] = data [j] ; data[j] = tmp ; flag = true ; } } System.out.println(java.util.Arrays.toString(data)); //if(flag =false),则表明这一趟没有进行交换,处于有序 if(!flag){ break; } } } //选择排序,第一次循环是第一个与后边的每一个比较,选出最小的放第一个,第二次是从第二个开始,依次和后边的比较 public static void SelectSort(Data [] data){ System.out.println("开始排序:"); int length = data.length ; for(int i = 0; i < length-1; i++){ //minIndex用来记录当前这个i的下标,当有第一趟下来换最小的一个就是,减少了交换次数。 int minIndex = i; for(int j = i+1; j < length; j++){ if(data[minIndex].compareTo(data[j]) > 0){ minIndex = j ; } } //不等于i说明有交换 if(minIndex != i){ Data tmp = data[i] ; data[i] = data [minIndex] ; data[minIndex] = tmp ; } System.out.println(java.util.Arrays.toString(data)); } } public static void main(String args[]){ Data[] data = { new Data(9," "), new Data(-16," "), new Data(21,"*"), new Data(23," " ), new Data(-30," "), new Data(-49," "), new Data(21," "), new Data(30,"*"), new Data(30," ") }; System.out.println("排序之前:\n"+java.util.Arrays.toString(data)); //shellSort(data); //insertSort(data); //QuickSort(data); //BubbleSort(data); SelectSort(data) ; System.out.println("排序之后:\n"+java.util.Arrays.toString(data)); } }
相关文章推荐
- 常见排序算法的Java实现
- java排序
- 使用java中replaceAll方法替换字符串中的反斜杠
- Java系统调优:内存管理与垃圾回收
- JavaSE知识集锦(1)深拷贝与浅拷贝
- java设计模式——结构型之门面模式
- java单点登录系统CAS的简单使用
- JDK动态代理和CGLiB动态代理
- JAVA HASHMAP 如何用
- java中HashMap详解
- [Java] i++与++i的区别(后缀++与前缀++)
- Java运算符优先级
- Ubuntu 15.10 程序“java”已包含在下列软件包中,安装jdk1.8.73
- Java编程规范
- 线程
- Java遇见HTML——JSP篇之JavaWeb简介
- java中dao层和service层的区别是什么?
- Java内存溢出的几种情况
- Eclipse中的快捷键总结
- Java配置文件的使用