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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。