快速排序(QuickSort)又称分割交换排序,是目前公认最佳的排序法,也是使用“分而治之”的方式,先会在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分,其中小于中间值的数据放在左边而大于中间值的数据放在右边,再以同样的方式分别处理左右两边的数据,直到排序完为止。
1.在最快和平均情况下,时间复杂度为O(nlog2n)。最坏情况就是每次挑中的中间值不是最大就是最小,因而最坏的情况下时间复杂度为O(n^2)。
2.快速排序法不是稳定排序法。
3.在最差的情况下,空间复杂度为O(n),而最佳情况为O(log2n)。
4.快速排序法是平均运行时间最快的排序法。
分割步骤:
1.先假设K的值为第一个键值
2.从左往右找出Ki>K的键值Ki
3.从右往左找出Kj<K的键值Kj
4.如果i<j,那么Ki与Kj互换,并返回到步骤2
5.若i>=j,那么将K与Kj交换,并以j位置为基准点分割成左右部分。然后再针对左右两边进行步骤1至步骤5,直到左半边键值=右半边键值为止(i=j)。
package Sort;
import java.io.*;
import java.util.*;
//设计一个Java程序,输入数列的个数,并使用随机生成数值,再使用快速排序法进行排序。
public class QuickSort extends Object{
int size;
int process=0;
int data[]=new int[10];
public static void main(String[] args) {
// TODO Auto-generated method stub
QuickSort test=new QuickSort();
System.out.print("请输入数组大小(10)以下:");
try {
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
test.size=Integer.parseInt(br.readLine());
}catch(Exception e) {}
test.inputarr();
System.out.print("原始数据:");
test.showdata();
test.quick(test.data, test.size, 0, test.size-1);
}
void inputarr() {
Random rand=new Random();
int i;
for(i=0;i<size;i++) {
data[i]=(Math.abs(rand.nextInt(99)))+1;
}
}
void showdata() {
int i;
for(i=0;i<size;i++) {
System.out.print(data[i]+" ");
}
System.out.println();
}
void quick(int d[],int size,int lf,int rg) {
int i,j,temp;
int lf_idx;
int rg_idx;
int t;
if(lf<rg) {
lf_idx=lf+1;
rg_idx=rg;
while(true) {
System.out.print("处理过程"+(process++)+": ");
for(t=0;t<size;t++) {
System.out.print(+d[t]+" ");
}
System.out.println();
for(i=lf+1;i<=rg;i++) {
if(d[i]>=d[lf]) {
lf_idx=i;
break;
}
lf_idx++;
}
for(j=rg;j>=lf+1;j--) {
if(d[j]<=d[lf]) {
rg_idx=j;
break;
}
rg_idx--;
}
if(lf_idx<rg_idx) {
temp=d[lf_idx];
d[lf_idx]=d[rg_idx];
d[rg_idx]=temp;
}else {
break;
}
}
if(lf_idx>=rg_idx) {
temp=d[lf];
d[lf]=d[rg_idx];
d[rg_idx]=temp;
quick(d,size,lf,rg_idx-1);
quick(d,size,rg_idx+1,rg);
}
}
}
}