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