您的位置:首页 > 编程语言 > Java开发

快速排序(JAVA描述)

2016-03-30 14:33 337 查看
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

一趟快速排序的算法是:

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

现象:可比较我的其他算法现象

组建数组元素个数:10000000(千万)

组件随机数组运行时间:233ms

排序运行时间:78ms

import java.util.Random;

public class QuitSort {

public static void show(int [] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"、");
}
System.out.println();
}

public static int[] get_intarr(int len){
long begin = System.currentTimeMillis();
Random ran = new Random();
int [] result = new int[len];
for(int i=0;i<len;i++){result[i] = ran.nextInt(100); }
long runtime = System.currentTimeMillis()-begin;
System.out.println("组建数组元素个数:"+len);
System.out.println("组件随机数组运行时间:"+runtime);
return result;
}

/**
* 将a[begin]放在一个位置,左边小于a[begin],右边大于a[begin]
* @param a 数组
* @param begin 起始位置[以此为标准]
* @param end 结束位置
*/
public static int adjustArray(int []a,int begin,int end){
int tmp = a[begin];
int i=begin,j=end;
while(i<j){
//从右至左找到小于tmp的数,然后a[i]=a[j],调换位置
while(i<j && a[j]>=tmp){
j--;
}
if(a[j]<tmp){
a[i] = a[j];
i++;
}

//从左至右找到大于tmp的数,然后a[j]=a[i],调换位置
while(i<j && a[i]<=tmp){
i++;
}
if(a[i]>tmp){
a[j] = a[i];
j--;
}
}
a[i]=tmp;

return i;
}
/**
* 递归将begin位置数字放置正确位置,直至begin=last
* @param a
* @param begin
* @param last
*/
public static void quickSort(int []a,int begin,int last){
if(begin < last){
int i = adjustArray(a, begin, last);
adjustArray(a,begin,i-1);
adjustArray(a, i+1, last);
}
}

public static void main(String[] args) {
int a[] = get_intarr(10000000);
long begin = System.currentTimeMillis();
quickSort(a,0,a.length-1);
long runtime = System.currentTimeMillis()-begin;
System.out.println("排序运行时间:"+runtime);
//      show(a);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息