Java语言实现快速排序
快速排序的思想是:通过一趟排序将待排的记录划分为独立的两部分,称为前半区和后半区,其中,前半区中的关键字均不大于后半区记录的关键字,然后再分别对这两部分记录继续进行快速排序,从而使整个序列有序。
一趟快速排序的过程称为一次划分,具体做法是:附设两个位置指示变量i和j,它们的初值分别指向序列的第一个记录和最后一个记录。设枢轴记录(通常是第一个记录)的关键字为privot,则首先从j所指位置向前搜索,找到第一个关键字小于privot的记录时将该记录向前移到i指示的位置,然后从i所指的位置向后搜索,找到第一个关键字大于privot的记录时将该记录向后移动到j所指的位置,重复该过程直至i与j相等为止------------以上文字皆摘自软件设计师教程书中。
跳过文字,直接撸代码。为了方便理解,将上述文字中的i替换为start,j替换为end,privot替换为flag
//一趟快速排序的过程
public static int procedure(Object[] arr,int start,int end){
Object flag = arr[start]; //上述文字中描述的枢轴记录,通常是第一个记录即arr[start]
Object temp = null;
//start =end 时,一趟快速排序结束
while(start < end){
while(start < end && arr[end].hashCode() >= flag.hashCode()){
end--;
}
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
while(start < end && arr[start].hashCode() <= flag.hashCode()){
start++;
}
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
//返回start值,start值为整个数组前半区和后半区的分隔坐标
return start;
}
//对数组进行快速排序
public static void quickSort(Object[] arr,int start,int end){
if(start < end){
int result = procedure(arr,start,end);
//递归方式对前半区和后半区进行快速排序
quickSort(arr,start,result-1);
quickSort(arr,result+1,end);
}
}
测试
public static void main(String[] args){
Object[] arr = new Object[]{"Q","H","C","Y","P","A","M","S","R","D","F","X"};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
输出
[A, C, D, F, H, M, P, Q, R, S, X, Y]