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

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值