软件编码实践之一(重写快速排序)

在软件开发中,对于开发人员危害最大的是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);
}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章