快速排序
快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列,简而言之,就是一直将数据分成两部分,一部分比基准值大,一部分比基准值小,然后进行递归,退出递归循环条件后就变为有序的
总结:快速排序是一种原地排序,不需要开辟另外的空间,只是相当于指针一样在内存中变来变去,内存消耗较小,空间复杂度为1,比较稳定,时间复杂度 仅为 nlogn
java代码
package com.wuzhixin.datastructrue;
import java.util.Arrays;
/**
* 吴志新
* 2019/9/4-16:01
* _23designpatterns
**/
public class QuickSort2 {
public static void main(String[] args) {
//int [] arr = {10,78,0,44,23,-567,70};
int[] arr = {111, 3, 5, 52, 74, 312, 75, 3, 764, 3, 2111, 7, 31};
quickSort2(arr,0,(arr.length-1));
System.out.println(Arrays.toString(arr));
}
public static void quickSort2(int arr[] ,int start,int end){
//定义一个基准数 ,这里以第一个数作为 基准数
int baseValue = arr[start];
int startIndex = start;
int endIndex = end;
while (startIndex<endIndex){
while(baseValue<=arr[endIndex]&&startIndex<endIndex){ //如果基准数和后面的数比较 如果 后面的大就指针前移
endIndex--;
}
//退出循环后,找到要操作的值,将其放在前面
arr[startIndex]=arr[endIndex];
while(baseValue>=arr[startIndex]&&startIndex<endIndex){
startIndex++;
}
//退出循环后,找到要操作的值,将其放在后面
arr[endIndex]=arr[startIndex];
}
//当整个循环结束
//startindex= endindex ,将基准值赋给最后一个要填充的地方
arr[startIndex]=baseValue;
//当结束完成后 startIndex 和 endIndex重合 ,所以进行左边递归 ,和右边递归
if(start<(startIndex-1)) {// 退出递归的条件
quickSort2(arr, start, (startIndex - 1));
}
if((startIndex+1)<end) { //退出递归的条件
quickSort2(arr, (startIndex + 1), end);
}
}
}
截图: