快速排序
基本介紹
快速排序(Quick sort)是對冒泡排序的一種改進。基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按照此方法對這兩部分數據分班進行快速排序。整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
快速排序算法的過程
代碼實現
package sort;
import java.text.SimpleDateFormat;
import java.util.Date;
public class QuickSort {
public static void main(String[] args) {
//int[] arr = {-9,78,0,23,-567,70};
//測試快速排序速度,給80000個數據,測試
//創建一個80000個隨機的數組
int[] arr1 = new int[80000];
for (int i = 0;i < 80000;i ++) {
//會生成一個[0,8000000]的數
arr1[i] = (int)(Math.random() * 8000000);
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1Str = simpleDateFormat1.format(date1);
System.out.println("排序前的時間:" + date1Str);
//測試快速排序
quickSort(arr1,0,arr1.length-1);
Date date2 = new Date();
String date2Str = simpleDateFormat1.format(date2);
System.out.println("排序後的時間:" + date2Str);
}
public static void quickSort(int[] arr,int left,int right) {
int l = left;//左下標
int r = right;//右下標
//pivot中軸
int pivot = arr[(left + right) / 2];
//臨時瀕臨,作爲交換時使用
int temp = 0;
//whlie循環的目的是讓比pivot小的,放到左邊,反之放到右邊
while (l < r) {
//在pivot達到左邊一直找,找到大於等於pivot的值,才退出
while (arr[l] < pivot) {
l += 1;
}
//在pivot達到右邊一直找,找到小於等於pivot的值,才退出
while (arr[r] > pivot) {
r -= 1;
}
//如果l>=r,說明pivot的左右倆的值,已經按照規則排完,左邊小於pivot,右邊大於
if (l >= r) {
break;
}
//交換
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//如果交換之後,發現arr[l] == pivot值,則r-1,前移
if (arr[l] == pivot) {
r -= 1;
}
//如果交換之後,發現arr[r] == pivot值,則l+1,後移
if (arr[r] == pivot) {
l += 1;
}
}
//如果l == r,讓l++,r--,否則會出現棧溢出
if (l == r) {
l += 1;
r -= 1;
}
//向左遞歸
if (left < r) {
quickSort(arr,left,r);
}
//向右遞歸
if (right > l) {
quickSort(arr,l,right);
}
}
}
筆記源自:韓順平數據結構與算法