快排算法,是很经典的一种算法,大概有这么几步
- 1 以需要排序范围第一个元素为关键值。
- 2 先从右往左查找,直到第一个小于关键值的元素,将此元素和关键值交换,并记下下标。
- 3 然后从左往右查找,直到找到第一个大于关键值的元素,将此元素和关键元素交换,记下下标。
- 4 以刚刚记录的下标为基准,重复2-3两步,直到关键值左边的都小于关键值,右边的都大于关键值。
- 5 分别对关键值左边部分,和右边部分做快速排序。
简单用java实现了下 快排
public class QuickSort {
/**
* 交换数组里面的两个元素
* @param list 数组
* @param a 交换的下标
* @param b 另一个交换的下标
*/
public static void swap( int[] list , int a , int b ) {
int temp = list[a];
list[a] = list[b];
list[b] = temp;
}
/**
* 快速排序的主要算法,思想方法是
* 1 以需要排序范围第一个元素为关键值。
* 2 先从右往左查找,直到第一个小于关键值的元素,将此元素和关键值交换,并记下下标。
* 3 然后从左往右查找,直到找到第一个大于关键值的元素,将此元素和关键元素交换,记下下标。
* 4 以刚刚记录的下标为基准,重复2-3两步,直到关键值左边的都小于关键值,右边的都大于关键值。
* 5 分别对关键值左边部分,和右边部分做快速排序。
* @param list
* @param l
* @param r
*/
private static void quicksort( int[] list , int l , int r ) {
if( l >= r) {
return;
}
int i = l , m = r;
int key = list[l];
while( m > i ) {
while( m > i && list[m] >= key ) {
m--;
}
swap(list, i, m);
while( i < m && list[i] <= key ) {
i++;
}
swap(list, i, m);
System.out.println(" m = " + m + " , i = " + i );
printArray(list);
}
quicksort(list,l,m - 1);
quicksort(list,m + 1,r);
}
public static void printArray(int[] list) {
for( int i = 0 ; i < list.length ; i++ ) {
System.out.print(list[i] + " , " );
}
System.out.println();
}
public static void main(String[] args) {
int[] test = {23,4,56,20,92,14,69,89,33,45,11,2,3};
printArray(test);
quicksort(test,0,test.length-1);
printArray(test);
}
}