淺析java疾速排序算法。本站提示廣大學習愛好者:(淺析java疾速排序算法)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析java疾速排序算法正文
疾速排序是找出一個元素(實際上可以隨意找一個)作為基准(pivot),然後對數組停止分區操作,使基准右邊元素的值都不年夜於基准值,基准左邊的元素值 都不小於基准值,如斯作為基准的元素調劑到排序後的准確地位。遞歸疾速排序,將其他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-完成的時刻,此時令輪回停止)。
舉例解釋一下吧,這個能夠不是太好懂得。假定要排序的序列為
package com.zc.manythread;
import java.util.Random;
/**
* 疾速排序
* @author Administrator
*
*/
public class QSort {
int [] date;
public QSort(int[] date) {
this.date=date;
}
/**
* 交流函數
* @param a
* @param i
* @param j
*/
private void swap(int a[],int i,int j) {
int T;
T=a[i];
a[i]=a[j];
a[j]=T;
}
/*******************
* 排序函數
* @param a
* @param lo0
* @param hi0
* @return
*/
int[] QuickSort(int a[],int lo0,int hi0){//分治法,感化就是將數組分為A[lo0..q-1] 和A[q+1..hi0]
int lo=lo0;
int hi=hi0;
int mid;
if (hi0>lo0) {
mid=a[(hi0+lo0)/2];
while(lo<=hi){
while((lo<hi0)&&(a[lo]<mid)) ++lo;
while((hi>lo0)&&(a[hi]>mid)) --hi;
if (lo<=hi) {
swap(a,lo,hi);
++lo;
--hi;
}
}
if (lo0<hi) {
QuickSort(a, lo0, hi);
}
if (lo<hi0) {
QuickSort(a, lo, hi0);
}
}
return a;
}
/**************
*
* 創立有反復數組數據
* *****************/
private static int[] createDate(int count) {
int[] data=new int[count];
for (int i = 0; i < data.length; i++) {
data[i]=(int)(Math.random()*count);
}
return data;
}
/**
* 無反復數組數據
* @param count
* @return
*/
private static int[] createDate1(int count) {
int[] data=new int[count];
Random rand = new Random();
boolean[] bool = new boolean[100];
int num = 0;
for (int i = 0; i < count; i++) {
do {
// 假如發生的數雷同持續輪回
num = rand.nextInt(100);
} while (bool[num]);
bool[num] = true;
data[i]=num;
}
return data;
}
/**************主函數*****************/
public static void main(String[] args) {
final int count=10;
int[] data=createDate1(count);
for (int n:data) {
System.out.print(n+"\t");
}
QSort data1=new QSort(data);
System.out.println();
int[] a=data1.QuickSort(data,0, count-1);
for (int n:a) {
System.out.print(n+"\t");
}
}
}
成果以下:
以上就是本文所述的全體內容了,願望小同伴們可以或許愛好。