快速排序
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
基本步骤为:
1.设定关键字,划分成两个数组,比关键字小的放在一边,大的放在另一边
2.我们选择设置数组最右端为关键字
3.递归实现快速排序,通过递归给每一个子数组快速排序
我们看个例子:
有一组int类型数据:arr[ 6 ] = { 9 ,2 ,7 ,3 ,8 ,6 } ;
那么进行快速排序时候:
首先设置两个指针,从最左和最右向中间靠拢,遇到比关键字大(小)就停,然后交换位置,再继续向中间靠拢。获得排序切入点(第 i 个位置)。
第一轮:6为关键字,进行分割数组(并不排序):(大括号里的是子串)
{2,3}和{9,7,8}然后把6插入到中间第 i (2)位上,
结果:{2,3},6,{9,7,8}
第二轮:从0开始到 i 进行一次快排(选取3作为关键字);从 i +1到 arr.length - 1进行快排(选8关键字)
结果:{2},3,6,{7},8,{9}
第三轮结果:对3个子串再快排(同上)
结果:2,3,6,7,8,9
快排完成。
那么接下来代码实现:(java)
//快速排序
//划分成两个数组,通过递归给每一个子数组快速排序
//1.设定关键字,比关键字小的放在一边,大的放在另一边
//2.设置数组最右端为关键字
//3.递归实现快速排序
public class QuickSort {
//划分数组
public static int part(long[] arr , int left , int right , long point) {
//两个指针
int leftptr = left - 1;
int rightptr = right;
while(true) {
//从最左和最右开始找,比point大的放右边,比point小的放左边
while(leftptr < rightptr && arr[++leftptr] < point);
while(leftptr < rightptr && arr[--rightptr] > point);
//找到后交换,然后再继续找
if(leftptr >= rightptr) {
break;
}
else {//交换
long tmp = arr[leftptr];
arr[leftptr] = arr[rightptr];
arr[rightptr] = tmp;
}
}
//数组分割完毕,把关键字插入中间
long tmp = arr[leftptr];
arr[leftptr] = arr[right];
arr[right] = tmp;
//返回切入点位置
return leftptr;
}
public static void sort(long[] arr , int left , int right) {
if (right <= left) {
return;
}
else {
//设置最右为关键字
long point = arr[right];
//获得切入点同时划分
int part = part(arr, left, right, point);
//递归对左边数组排序
sort(arr, left, part - 1);
//右边排序
sort(arr, part + 1, right);
}
}
//打印数组
public static void displayArr(long[] arr) {
for(int i = 0 ; i < arr.length ; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
test类:这里选取随机生成10个数字进行排序
public class TestQuickSort {
public static void main(String[] args) {
// TODO 自动生成的方法存根
long[] arr = new long[10];
for(int i = 0 ; i < arr.length ; i++) {
arr[i] = (long) (Math.random() * 99);
}
long point = arr[arr.length - 1];
QuickSort.displayArr(arr);
// QuickSort.part(arr, 0, arr.length - 1, point);
// QuickSort.displayArr(arr);
QuickSort.sort(arr, 0, arr.length - 1);
QuickSort.displayArr(arr);
}
}