java 概率 算法_使用概率算法优化快速排序(JAVA)
前言
前面一篇文章系統介紹了快速排序算法,提到快速排序雖然平均時間復雜度為o(n*log2(n)),效率相對比較高。但是其在特殊情況下,比如降序的情況下,效率和冒泡排序一致,這就削弱了快速排序給人的好感。然而有沒有辦法,能夠解決這種問題,使快速排序的時間復雜度與輸入序列無關呢?答案是有的,使用舍伍德概率算法能夠幫助解決這個問題。
舍伍德算法
舍伍德算法是三大概率算法之一,它的實質就是通過隨機概率解決問題與輸入順序的關聯,從而優化問題的解決。舍伍德算法還可用于層級鏈表問題,后續寫概率算法時會進一步提到。
優化
思路很簡單,為了使排序與輸入序列順序無關,在劃分基準時,我們確定一個隨機基準(low到high之間的一個隨機位置),將它與第一位(默認基準)進行交換,而后再進行基準位確定,進而分治快速排序其左半部分與右半部分。
Codes
package com.fairy.InnerSort;
import java.util.Scanner;
/**
* 舍伍德算法優化快速排序
* @author Fairy2016
*
*/
public class QuickSort {
//快速排序
public static void sort(int a[], int low, int high) {
if(low < high) {
int base = Depart(a, low, high);
//對基準左半邊部分進行排序
sort(a, low, base-1);
//對基準右半邊部分進行排序
sort(a, base+1, high);
}
}
//基準劃分
public static int Depart(int a[], int low, int high) {
//舍伍德隨機確定基準
int d = (int)Math.random()*(high-low)+low;
//交換默認基準與隨機基準
a[0] = a[d];
a[d] = a[low];
a[low] = a[0];
while(low < high) {
//從右向左掃描找比基準小的元素
while(low < high && a[high] >= a[0])
high--;
a[low] = a[high];//賦值,更新基準位
//從左向右掃描找比基準大的元素
while(low < high && a[low] <= a[0])
low++;
a[high] = a[low];//賦值,更新基準位
}
//基準位最終位置已確定,是low或者high
a[high] = a[0];
return high;
}
public static void Print(int a[], int n) {
for(int i = 1; i <= n; i++) {
System.out.print(a[i]+" ");
}
}
public static void main(String args[]) {
int n;
int a[];
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
n = scanner.nextInt();
if(n > 0) {
a = new int[n+1];
for(int i=1; i <= n; i++) {
a[i] = scanner.nextInt();
}
sort(a, 1, n);
Print(a, n);
}
}
scanner.close();
}
}
總結
以上是生活随笔為你收集整理的java 概率 算法_使用概率算法优化快速排序(JAVA)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人民大会堂烟是哪里的
- 下一篇: 上顿号符号_上顿号符号_标点符号(1):