日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 概率 算法_使用概率算法优化快速排序(JAVA)

發(fā)布時(shí)間:2024/9/19 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 概率 算法_使用概率算法优化快速排序(JAVA) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

前面一篇文章系統(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。