快速排序法
Posted 樱花树下叹息桥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序法相关的知识,希望对你有一定的参考价值。
基本思想:取数组的第一个位置作为基准值,小于基准值的放数组左边,大于基准值的放数组右边,递归数组两边的排序.
代码实现:
第一代版本:
运行结果:
缺点:该版本只能对存储不重复数的数组进行排序,若数组含有重复数,改程序将死循环.
源码:
import java.util.Arrays;
public class QuickSort {
public static void quickSort(int[] arr,int low,int high) {
int i = low;
int j = high;
if(low >= high) {
return;
}
int key = i;
while(low < high) {
while(low < high && arr[high] > arr[key]) {
high--;
}
while(low < high && arr[low] < arr[key]) {
low++;
}
if(low < high) {
int temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
}
}
if(low < high) {
int temp = arr[key];
arr[key] = arr[low];
arr[low] = temp;
}
quickSort(arr, key+1, j);
quickSort(arr, i, key-1);
}
public static void main(String[] args) {
int arr[] = {1,3,2,5,66,33,22,0,55,8};
QuickSort.quickSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
}
第二代版本:
代码实现:
运行结果:
该程序好处是不会漏掉任何一个数,坏处是交换次数较多,效率较低
源码:
import java.util.Arrays;
public class QuickSort2 {
public static void sort(int[] arr,int low,int high) {
if(low > high) {
return;
}
int i = low;
int j = high;
int value = arr[i];
boolean flag = true;
while(i != j) {
if(flag) {
if(value > arr[j]) {
swap(arr,i,j);
flag = false;
}else {
j--;
}
}else {
if(value < arr[i]) {
swap(arr,i,j);
flag = true;
}else {
i++;
}
}
}
sort(arr,low,i-1);
sort(arr,i+1,high);
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int arr[] = {1,3,2,5,66,33,22,0,55,8,8};
QuickSort2.sort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
}
以上是关于快速排序法的主要内容,如果未能解决你的问题,请参考以下文章
[ 数据结构 -- 手撕排序算法第五篇 ] 快速排序 <包含hoare法,挖坑法,前后指针法> 及其算法优化