1、快速排序,时间复杂度O(nlogn)
算法的思路:为了叙述的方便,这里以实现升序排列为例。
a)从待排序的数组A中,任意选择一个数,做为分界值,
b)将小于等于这个分界值小的数,放到它的前面,记为数组B1;比分界值大的数,放到它的后面,记为数组B2,这样就确定了分界值应该在的位置,是B1的最后一个。
c)分别对B1和B2重复a)b),直到数组长度为1,在对B1执行a)时,数组长度应该减去1,因为B1的最后一位的位置就是在这里,不需要再进行排序了。
d)最后将排好序的B1和B2写到数组A中。由于是递归算法,只有在B1和B2已经排好序时在最终写入A。
举例:待排序数组A=[ 3 5 2 7 6 9 4],1)选择最后一个数4,做为分界值。2)则B1=【3 2 4】,B2=【5 7 6 9】。3)对B1执行a)和b),即选择B1的倒数第二个数做为分界值,C1=【2】,C2=【3】。此时数组长度为1,可以写回上一步,也就是B1=C1+C2+B1的最后一位,即B1=【2 3 4】接下来排序B2,依次类推,返回到A。
package Algorithms;
import java.util.Scanner;
public class QuickSort {
public static void main(String[] args) {
System.out.println("input the number of array:");
Scanner in = new Scanner(System.in);
int k = in.nextInt();
int[] array = new int[k];
System.out.println("input array with "+k+" numbers:");
for(int i=0;i<k;i++){
array[i] = in.nextInt();
}
AList AA = new AList(k,array);
AA.printA();
AA.SortA(AA.getnum());
AA.printA();
}
}
class AList{
public AList(int k, int[] Tarray) {
num = k;
array = new int[num];
for(int i=0;i<num;i++)
array[i] = Tarray[i];
}
public void printA(){
for(int i:array)
System.out.printf("%4d",i);
System.out.println();
}
public void SortA(int k){
if(k<=1){
return;
}
int level = array[k-1];
int numA1 = 0;
int numA2 = 0;
int[] A1 = new int[k];
int[] A2 = new int[k];
for(int i=0;i<k;i++){
if(array[i]<=level){
A1[numA1] = array[i];
numA1++;
}else{
A2[numA2] = array[i];
numA2++;
}
}
AList B1 = new AList(numA1,A1);
AList B2 = new AList(numA2,A2);
B1.SortA(numA1-1);
B2.SortA(numA2);
for(int i=0;i<numA1;i++)
array[i]=B1.getEmp(i);
for(int i=0;i<numA2;i++)
array[numA1+i]=B2.getEmp(i);
}
public int getnum(){
return num;
}
public int getEmp(int k){
return array[k];
}
private int num;
private int[] array;
}