Java实现数据排序(冒泡、选择、插入、快速排序)---方法持续更新中
来源:互联网 发布:木地板推荐 知乎 编辑:程序博客网 时间:2024/05/16 03:34
【Added by Light on 2014-07-27】
今天终于又来更新文章了,也是因为笔者上周忙的要死,又跟一群人去搞了搞课外活动,下面的代码又更新了一个快速排序法,确实很快,也确实耗CPU内存很多……
实测80000000随机数据排序,耗时4秒,CPU瞬间飙到28%.
/**************************************/
再一次贴出代码来,一是想激励一下自学的自己,再一个是想帮助需要的人,还有一个是希望有大神看到并不吝赐教。呵呵。。。
简单说明:
1.每种排序方法均封装在了一个单独的类中;
2.个人测试使用时,可在main中自己选择注释与解除注释来调用不同方法;
友情提示:个人测试时,千万不要用我的随机生成80000000个数的数组,用我下面那个注释掉的8个元素的数组就OK了。
另外,有个问题,希望看到文章的并有心看完的同仁发表下见解---->
我本机笔记本(Lenovo T440p 4GB - I5-4200M-2.50GHz )测试的排序效率:
冒泡:(本机实测:80万随即数据排序-->排序前:Fri Jul 18 18:20:27 CST 2014 排序前:Fri Jul 18 18:22:17 CST 2014)
选择:(本机实测:80万随机数据排序-->排序前:Fri Jul 18 19:56:43 CST 2014 排序前:Fri Jul 18 19:58:54 CST 2014)
插入:80000000万随机数据,1秒钟;
我确定用8个元素的数组都已经测试过了,排序方法是没有问题的,但是我很质疑插入排序方法的这个效率。
大家可以检查下我的代码,看哪里有问题没?
/** * 展示各种排序方法:冒泡,选择,插入,快速排序法 * 排序方法均采用封装在类中的方式 * created by Light on 2014-7-18 */package com.second;import java.util.*;public class DoSorting {public static void main(String[] args) {// TODO Auto-generated method stub//随机产生一个长度为80000的数据,这里先产生整数数组//int a = 800000;int [] arr = new int[80000000];//int arr[] = {0,-1,2,4,-6,33,10,11};//初始化数组,使用for循环for(int i=0;i<arr.length;i++){arr[i] = (int)Math.random()*100000;} //使用冒泡法排序//Bubble b = new Bubble();//使用选择法//Selection s = new Selection();//插入法 //Insertion it = new Insertion(); //快速排序法 QuickSort qc = new QuickSort(); //排序之前打印系统时间 //Calendar c = Calendar.getInstance(); //Date d = new Date(); System.out.println("排序前:"+ new Date()); //调用排序 //冒泡 //b.sort(arr); //b.showArray(arr); //选择 //s.sort(arr); //s.showArray(arr); //插入 //it.sort(arr); //it.showArray(arr); //快速 qc.sort(0, arr.length-1, arr); //qc.showArray(arr); //排序之后打印系统时间 System.out.println("排序前:"+ new Date());}}//冒泡法类class Bubble{//Define public function directlypublic void sort(int arr[]) //using Array as kind of reference{for(int i=0;i<arr.length-1;i++)//外层循环控制轮询比较回合{//内层循环控制每个回合中的比较范围,没完成一个回合,范围应该减小一个元素//因为上一轮已经保证最大的排在了最后for(int j=0;j<arr.length-1-i;j++){int temp = 0;//判断大小if(arr[j]>arr[j+1]){temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}//提供打印数组的方法public void showArray(int arr[]){System.out.print("数组排序后为:");//for循环打印for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}System.out.println();}}//选择法类class Selection{//直接创建选择方法public void sort(int arr[]){//外层循环控制回合数,每一个回合都把最小的一个数与arr[i]交换for(int i=0;i<arr.length-1;i++){//内存循环保证每个回合,即每一次内层循环退出时,找到一个最小值int minArr = arr[i];int minIndex = i;int temp =0 ;for(int j=i+1;j<arr.length;j++){//判断所去元素与minArr的大小,如果arr[j]比minArr小,则两者交换位置,否则不做处理if(arr[j]<minArr){minArr = arr[j];minIndex = j;}}//当循环退出时,minArr保证是本轮比较数组中最小的一个数temp = arr[i];arr[i] = minArr;arr[minIndex] = temp;}}//showArraypublic void showArray(int arr[]){System.out.print("数组排序后为:");//for循环打印for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}System.out.println();}}//插入法类class Insertion{//直接创建插入方法public void sort(int arr[]){//外层循环保证-->从第二个元素开始,一直到最后一个数-->进入内层处理逻辑,即在前面找到自己合适的位置for(int i=1;i<arr.length;i++){int tempArr = arr[i];//int minArr = arr[i-1];int minIndex = i-1;while(minIndex>=0 && arr[minIndex] > tempArr){arr[minIndex+1]=arr[minIndex];minIndex--;}//内层循环退出,表示找为arr[i]到了合适的位置,即arr[minIndex+1]//需要把tempArr赋给前面空出来的位置arr[minIndex+1] = tempArr;}}//showArraypublic void showArray(int arr[]){System.out.print("数组排序后为:");//for循环打印for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}System.out.println();}}//快速查询法class QuickSort{ //定义sort方法 public void sort(int left,int right, int array[]) { int l = left; int r = right; int pivot = array[(left+right)/2]; int tempArray = 0;//后面做交换使用 while(l<r)//大的条件是l<r,即左边界要小于右边界 { //内层分隔处理,左右各自处理 while(array[l]<pivot) {l++;} while(array[r]>pivot) {r--;} //如果在上面两个循环退出时,l>=r,则表示pivot的左边都比pivot小,右边都比pivot大,此轮排序目的达到,即将array分为两部分 if(l>=r) break; //如果上面条件不成立,则将上面while循环找出的不符合条件的左右元素对调,目的也是向把array分为两部分靠拢 tempArray = array[l]; array[l] = array[r]; array[r] = tempArray; //有可能存在array[l] or array[r]正好就是pivot,此时可在对调之后直接越过此元素,此时可以返回顶层while去检查l<r是否为true if(array[l]==pivot) {r--;} if(array[r]==pivot) {l++;} } //如果while退出,此时返回l=r,为了保证这个值不再参与排序,同样要保证能进入递归,需要将l and r 都处理一下 if(l==r) { l++; r--; } //到此,第一轮的排序(分组)就完成了,将原array分为三部分--> array[0]~array[r] , array[l]~array[length-1]和array[l-1]不动元素 //并且,array[0]~array[r] 均小于array[l-1]; array[l]~array[length-1] 均大于 array[l-1] //下面调用本身,实现上面逻辑的递归,只是入参会适当修改 if(r>left) {sort(left, r, array);} if(l<right) {sort(l, right, array);} } //定义showArray方法 public void showArray(int arr[]) { System.out.print("数组排序后为:"); //for循环打印 for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+" "); } System.out.println(); } }
- Java实现数据排序(冒泡、选择、插入、快速排序)---方法持续更新中
- java实现冒泡排序,插入排序,选择排序,快速排序
- java实现冒泡,选择,插入,快速排序
- Java实现排序(快速排序、冒泡排序、选择排序、基数排序、插入排序)
- java实现排序(冒泡、选择、快速、插入)
- 冒泡排序、选择排序、插入排序、快速排序算法的时间性能分析(java实现)
- java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- java中各种常用排序实现(直接插入排序、直接选择排序、堆排序、冒泡排序、快速排序和归并排序)
- Java 排序 快速排序 冒泡排序 选择排序 插入排序
- Java实现排序(插入排序+冒泡排序+选择排序+ Shell排序+快速排序)
- java几种基本的排序方法,快速排序,冒泡排序,选择排序,插入排序
- 冒泡排序、选择排序、插入排序(Java实现)
- 冒泡排序、选择排序、直接插入排序(java实现)
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现(14/8/3更新加入二分排序)
- 选择排序&插入排序&冒泡排序&快速排序算法实现
- python 实现插入排序,冒泡排序,快速排序,选择排序
- 开源软件架构:Nginx
- 触摸绘图
- 遇到的小问题
- 写外挂的时候遇到有的用户用挂注入不了游戏~
- Struts.xml配置详解
- Java实现数据排序(冒泡、选择、插入、快速排序)---方法持续更新中
- 数据结构和算法设计专题之---24点游戏(穷举法和递归法)
- POJ2362 Square
- 【大话QT之十五】ctkPluginFrameWork插件系统Windows下编译
- 对扩展openflow协议的一点思考
- PAT:2-1. 厘米换算英尺英寸(15)
- 字符串KMP模式匹配算法
- hdu 1166 敌兵布阵
- mongodb /Haproxy/RabbitMQ/apache/memcached商业支持情况