快速排序
思想:
找到一个基准,通常来说选取左边第一个元素
定义中间变量temp接收基准值
两个哨兵i,j分别从数组左端、右端进行扫描
-
(a)先从右端开始扫描:哨兵j先从右端开始扫描,确保右端元素>基准值,当发现元素<基准值则对该值进行交换(当前元素赋值给哨兵i所在位置元素),此时哨兵j停止扫描
-
(b)当哨兵j停止扫描后:哨兵i从左端开始扫描,确保左端元素<基准值,当发现元素>基准值则对该值进行交换(当前元素赋值给哨兵j所在位置元素),此时哨兵i停止扫描
此后哨兵i,j继续从当前位置向左、向右继续扫描,继续执行以上(a)(b)操作,直到哨兵i,j相遇,然后将基准值赋值给哨兵i,j所在元素的位置(基准归位),则执行完一趟扫描。以此类推,即可完成排序。
快速排序:
public static void quickSort(int[] array,int _left,int _right){
int left = _left;
int right = _right;
int temp = 0;
if(left <= right){
temp = array[left];
while (left != right){
while (left < right && array[right] >= temp){
right--;
}
array[left] = array[right];
while (left < right && array[left] <= temp){
left ++;
}
array[right] = array[left];
}
//基准归位
array[right] = temp;
quickSort(array,_left,left - 1);
quickSort(array,right + 1,_right);
}
}
示例:
public class QuickSort {
public static void main(String[] args) {
quickSort(Swap.array,0,Swap.array.length - 1);
Swap.print(Swap.array);
}
/**
* 快速排序
* 两个哨兵i,j分别从数组左端、右端进行扫描
*
* (a)先从右端开始扫描:哨兵j先从右端开始扫描,确保右端元素>基准值,当发现元素<基准值则对该值进行交换(当前元素赋值给哨兵i所在位置元素),此时哨兵j停止扫描
* (b)当哨兵j停止扫描后:哨兵i从左端开始扫描,确保左端元素<基准值,当发现元素>基准值则对该值进行交换(当前元素赋值给哨兵j所在位置元素),此时哨兵i停止扫描
*
* 此后哨兵i,j继续从当前位置向左、向右继续扫描,继续执行以上(a)(b)操作,直到哨兵i,j相遇,然后将基准值赋值给哨兵i,j所在元素的位置(基准归位),则执行完一趟扫描。以此类推,即可完成排序。
* @param array
*/
public static void quickSort(int[] array,int _left,int _right){
int left = _left;
int right = _right;
int temp = 0;
if(left <= right){
temp = array[left];
while (left != right){
while (left < right && array[right] >= temp){
right--;
}
array[left] = array[right];
while (left < right && array[left] <= temp){
left ++;
}
array[right] = array[left];
}
//基准归位
array[right] = temp;
quickSort(array,_left,left - 1);
quickSort(array,right + 1,_right);
}
}
}
工具:
public class Swap {
/**
* 数组
*/
static int[] array = {8,2,5,9,1,3,10,22,5,87,100,7,94,4};
/**
* 交换
* @param array 数组
* @param x 交换元素下标
* @param y 交换元素下标
*/
public static void swap(int[] array,int x,int y){
int temp = array[x];
array[x] = array[y];
array[y] = temp;
}
/**
* 打印数组元素 遍历
* @param array
*/
public static void print(int[] array){
for (int i = 0; i < array.length; i++) {
System.out.print(" " + array[i]);
}
}
}
算法集合gitee项目:算法集合
目录:src/main/java/com/torlesse/leetcode/algorithm/common/QuickSort.java