在软件开发中,对于开发人员危害最大的是Ctrl+ C和Ctrl+ V,自己尝试写写快速排序法,编码期间发现了一个死循环,后续终于找到原因,看来编码不容易,还得多练手。
package myjava.ds.sort;
import java.util.Random;
public class QuickSort {
private int[] soureDataArray;
/**
* 方法getMiddle()主要以数组中第一个指针指向的值作为排序中间值,然后对于整个数组进行一次比较和交换,
使得所有低于排序中间值的整数放在该值左侧,高于中间值整数放在该值右侧。
完成一次比较和交换的中止条件是低位指针和高位指针相等,此时,指针指向的数组位放入这个排序中间值
* @param testArray
* @param low
* @param high
* @return
*/
public int getMiddle(int[] testArray,int low,int high){
//获取此次排序过程中,数组的最低位作为排序中间值
int middleValue;
//获取排序中间值,同时也对于该低位数据进行存储,使得后续可以使用低位位置存储找到的高位数据值
middleValue=testArray[low];
//最高标志位和最低标志位对比,直到最低位不高于最高位时,循环结束,
//循环结束,说明已完成一次数据比较,已使把数据按照中间值拆分为2个部分,
//以中间值所在的数组位置为基点,所有低于中间值数据,其位置在中间值的左侧,高于中间值数据在中间值的右侧
while(low<high){
//从高位开始比较,找到第一个小于排序中间值的数值,
//如果找到就进行移动,否则继续移动高位指针
while(low<high&&testArray[high]>=middleValue){
high--;
}
//这里的难点理解小于才能移动数据位置,如果等于,不能移动数据,会导致出现数值相等时,一直循环,无法结束整个排序过程
//移动数据到低位
testArray[low]=testArray[high];
//从低位开始比较,找到第一个大于排序中间值的数值,
//如果没有找到,就继续移动低位指针
while(low<high&&testArray[low]<=middleValue){
low++;
}
//满足条件后,把找到数值移动到之前高位存储位置,
//这里的难点理解大于才能移动数据位置,如果等于,不能移动数据,会导致出现数值相等时,一直循环,无法结束整个排序过程
//完成一次高位和地位的数据交换
testArray[high]=testArray[low];
}
testArray[low]=middleValue;
return low;
}
//quickSort 主方法接口;
public void quickSort(int[] testArray,int low,int high){
if(low<high){
int middleInt;
middleInt=getMiddle(testArray, low, high);
quickSort(testArray,low,middleInt-1);
quickSort(testArray,middleInt+1,high);
}
}
public int[] getArray(){
return soureDataArray;
}
public void pirntArray(int[] arrayInt){
int count=arrayInt.length;
int i=0;
System.out.println("ArrayValue print:");
while(count>0){
System.out.print(arrayInt[i]+" ");
i++;
count--;
if((count%10)==0){
System.out.println(" ");
}
}
}
/**
* 该模拟方法完成数据的模拟,产生出指定长度的整型数组
* @param size
*/
public void simulateData(int size){
int count=size;
int beginSize=0;
int tempIntvalue;
if(count>0){
Random dataRandom= new Random();
soureDataArray = new int[count];
while(count>0){
tempIntvalue=dataRandom.nextInt(1000);
soureDataArray[beginSize]=Math.abs(tempIntvalue);
beginSize++;
count--;
}
}
}
public static void main(String args[]){
QuickSort quickSort= new QuickSort();
quickSort.simulateData(100000);
int[] testArray=quickSort.getArray();
//排序之前先打印一下
//quickSort.pirntArray(testArray);
//long begintime=System.nanoTime();
long begintime=System.currentTimeMillis();
quickSort.quickSort(testArray, 0, testArray.length-1);
long endtime=System.currentTimeMillis();
System.out.println("Arraysize :"+testArray.length+" Sort Time:"+(endtime-begintime)+"ms");
quickSort.simulateData(500000);
testArray=quickSort.getArray();
begintime=System.currentTimeMillis();
quickSort.quickSort(testArray, 0, testArray.length-1);
endtime=System.currentTimeMillis();
System.out.println("Arraysize :"+testArray.length+" Sort Time:"+(endtime-begintime)+"ms");
quickSort.simulateData(1000000);
testArray=quickSort.getArray();
begintime=System.currentTimeMillis();
quickSort.quickSort(testArray, 0, testArray.length-1);
endtime=System.currentTimeMillis();
System.out.println("Arraysize :"+testArray.length+" Sort Time:"+(endtime-begintime)+"ms");
//排序之后再打印一下
//quickSort.pirntArray(testArray);
}
}