快速排序是一种分治排序的算法,将数组划分为两个部分,然后分别对两个部分进行排序。在实际应用中,一个经过仔细调整的快速排序算法应该在大多数计算机上运行的比其他排序算法要快的多,对于大型文件,快速排序的性能是希尔排序的5到10倍,它还能更高效的处理在实际问题中遇到的其他类型的文件。
快速排序的基本算法
快速排序的基本思想是:通过第一趟排序将数组划分成两个部分,一部分大于关键字,另一部分小于该值。接着对两个字数组继续进行快排,得到最终结果。
算法的实现:将数组中的第一个数作为关键字v,i和j分别从左边和右边向中间扫描,保证,i的左边都小于等于v,j的右边都大于等于v,一旦两个指针相遇,就交换a[i]和a[r],即将v赋值给a[i],这样v左侧的元素都小于等于v,v右边的元素都大于等于v,结束了划分过程。
其元素下标形式如下图所示:
一趟排序的示意图如下图所示:
一次快排之后,整个排序过程采用递归的形式,直到算法完成,具体代码如下
public static void sort(int[] a, int low, int high) {
int start = low;
int end = high;
int key = a[low];
while(end > start) {
// 从后往前比较
while(end > start && a[end] >= key)
end--;
if(a[end] <= key) {
int tmp = a[end];
a[end] = a[start];
a[start] = tmp;
}
while(end>start && a[start]<=key)
start++;
if(a[start]>=key) {
int tmp = a[start];
a[start] = a[end];
a[end] = tmp;
}
}
if(start>low) sort(a,low,start-1);
if(end<high) sort(a,end+1,high);
}
将剩余代码添加完成
public class Tesr {
public static void main(String[] args) {
int[] a = new int[] {2,3,1,5,4};
int start = 0;
int end = a.length - 1;
sort(a,start,end);
for(int i = 0; i<a.length; i++){
System.out.println(a[i]);
}
}
最终的输出结果为