1. 程式人生 > >隨機化快速排序

隨機化快速排序

之前寫過快速排序的程式碼,但是快速排序對已經排好序的陣列再進行排序的話,就會遇到最差的情況,演算法的複雜的也會達到n^2級別,所以對快速排序進行相應的優化,每次都隨機的選擇主元進行排序,這樣能夠最大的避免最差情況的發生,對於資料比較大的情況,程式執行的時間也有相應的提高,下面附上隨機化快排的相應的程式碼(附有註釋)。

#include<bits/stdc++.h>
using namespace std;
int n,a[1000001];
void qsort(int a[],int l,int r)
{
    int m=a[l+rand()%(r-l)+1];//隨機的選擇一個數作為主元 
int i=l,j=r,t; while(i<=j) { while(a[i]<m) i++; while(a[j]>m) j--; if(i<=j) t=a[i],a[i]=a[j],a[j]=t,i++,j--; } if(l<j) qsort(a,l,j);//遞迴呼叫對左邊的陣列在進行快排 if(r>i) qsort(a,i,r);////遞迴呼叫對右邊的陣列在進行快排
} int main() { cin>>n; srand((unsigned)time(NULL));//隨機數種子 for(int i=1;i<=n;i++) a[i]=rand()%(n*10)+1,cout<<a[i]<<" "; // 隨機的給陣列a賦初值 cout<<endl; qsort(a,1,n);//呼叫自己寫的隨機化快排 for(int i=1;i<=n;i++) cout<<a[i]<<" "; }

相關推薦

隨機快速排序

之前寫過快速排序的程式碼,但是快速排序對已經排好序的陣列再進行排序的話,就會遇到最差的情況,演算法的複雜的也會達到n^2級別,所以對快速排序進行相應的優化,每次都隨機的選擇主元進行排序,這樣能夠最大的避免最差情況的發生,對於資料比較大的情況,程式執行的時間也有相

演算法導論 第七章:快速排序 筆記(快速排序的描述、快速排序的效能、快速排序隨機版本、快速排序分析)

快速排序的最壞情況時間複雜度為Θ(n^2)。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能很好。它的期望執行時間複雜度為Θ(n lg n),而且Θ(n lg n)中蘊含的常數因子非常小,而且它還是原址排序的。 快速排序是一種排序演算法,對包含n個數的

分治法:快速排序,3種劃分方式,隨機快排,快排快,還是歸併排序快?

快速排序不同於之前瞭解的分治,他是通過一系列操作劃分得到子問題,不同之前的劃分子問題很簡單,劃分子問題的過程也是解決問題的過程 我們通常劃分子問題儘量保持均衡,而快排缺無法保持均衡 快排第一種劃分子問題實現方式,左右填空的雙指標方式 def partition_1(arr,low

分治法在排序演算法中的應用(JAVA)--快速排序(Lomuto劃分、Hoare劃分、隨機快排)

分治法在排序演算法中的應用 快速排序:時間複雜度O(nlogn) 如果說歸併排序是按照元素在陣列中的位置劃分的話,那麼快速排序就是按照元素的值進行劃分。劃分方法由兩種,本節將主要介紹Huare劃分,在減治法在查詢演算法中的應用(JAVA)--快速查詢這篇文章中講述了Lomu

演算法導論(一):快速排序隨機快排

排序演算法是演算法學習的第一步,想當初我學的第一個演算法就是選擇排序,不過當時很長一段時間我都不清楚我到底用的是選擇還是冒泡還是插入。只記得兩個for一個if排序就完成了。 再後來更系統地接觸演算法,才發現那才是排序演算法隊伍中小小而基本的一員。 買的《演算

快速排序隨機快排執行速度實驗比較

目錄 快速排序與隨機化快速排序 在電腦科學與數學中,一個排序演算法(英語:Sorting algorithm)是一種能將一串資料依照特定排序方式進行排列的一種演算法。最常用到的排序方式是數值順序以及字典順序。有效的排序演算法在一些演算法(例如搜尋演算法與合併演算法)中

快速排序(二) 隨機——C#實現

       一 快速排序隨機化       在快速排序(一)中提到,儘管快速排序的最差時間複雜度是θ(n^2),但是其平均時間複雜度是θ(nlgn),在文末的測試中也反映了這一點。但是作出這一判斷的前提是,我們認為輸入陣列的所有排列都是等概率的。但是這一假設並非往往都成

排序演算法c語言描述-快速排序隨機

今天在做資料結構排序實驗的時候,使用的快速排序。按理,我印象中快排是很高效的,不過,這次400w的資料,排了2659秒,有點意想不到,讓我一度懷疑了演算法是否寫錯了。 不過,認真分析,認真想想後, 也就釋然了。 快排其實就是冒泡的升級版。 每次遞迴,把當前序列分成兩部分,

快速排序(經典快排以及隨機快排)

分數 partition ref tps 一個 com urn 分享圖片 return 快速排序(Quicksort)是對冒泡排序的一種改進。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的

視覺快速排序(JAVA)

視覺化的快速排序(JAVA) 看了《演算法第四版》後,想要熟練下自己對排序演算法的理解,就選擇用快速排序來練手,並運用了《演算法第四版》提供的API,以實現排序演算法的視覺化。 在眾多排序演算法中,快速排序是其中有很高效率的一種,同時也是較為複雜的排序演算法。 快速排序的思想:

快速排序隨機快速排序

轉載http://blog.csdn.net/always2015/article/details/46523531 一、問題描述 實現對陣列的普通快速排序與隨機快速排序 (1)實現上述兩個演算法 (2)統計演算法的執行時間 (3)分析效能差異,作出總結 二、演

演算法初級02——荷蘭國旗問題、隨機快速排序、堆排序、桶排序、相鄰兩數的最大差值問題、工程中的綜合排序演算法

主要討論:荷蘭國旗問題、隨機快速排序、堆排序、穩定性、比較器、桶排序、相鄰兩數的最大差值問題和簡單介紹工程中的綜合排序演算法   題目一 給定一個數組arr,和一個數num,請把小於等於num的數放在陣列的左邊,大於num的數放在陣列的右邊。 要求額外空間複雜度O(1),時間複雜度O(N)

柯里函式、快速排序、外邊距重疊

柯里化函式柯里化函式通常也稱為部分求值,其含義是給函式分步傳遞引數,每次傳遞引數後部分應用引數,並返回一個更具體的函式接受剩下的引數,這中間可巢狀多層這樣的接受部分函式引數,直至返回最後結果。 例子:實現carrying函式,完成以下需求,程式碼如下:function sum(a,b,c){return a

柯裏函數、快速排序、外邊距重疊

一個 === ring 函數參數 quic 就是 快速排序 傳遞 tro 柯裏化函數柯裏化函數通常也稱為部分求值,其含義是給函數分步傳遞參數,每次傳遞參數後部分應用參數,並返回一個更具體的函數接受剩下的參數,這中間可嵌套多層這樣的接受部分函數參數,直至返回最後結果。 例子:

演算法初級02——荷蘭國旗問題、隨機快速排序、堆排序

public static void heapSort(int[] arr) { if (arr == null || arr.length < 2) { return; } for (int i = 0; i <

雙路快速排序演算法及三路快速排序演算法視覺

雙路快速排序演算法 工具類 import java.awt.*; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.lang.Interrup

排序演算法---快速排序隨機快速排序和雙路快排(python版)

[原文連結](https://blog.csdn.net/m0_37519490/article/details/80648011) 1、什麼是快速排序演算法? 快速排序是由東尼·霍爾所發展的一種排序演算法,速度快,效率高,也是實際中最常用的一種演算法

視覺排序二:氣泡排序、雞尾酒排序快速排序

氣泡排序 氣泡排序的視覺化圖: 氣泡排序的概念:氣泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直至沒有反序的記錄為止。因為按照該演算法,每次比較會將當

Swift如何快速隨機陣列中的元素

隨機化陣列元素或稱為”洗牌”,是比較常用的演算法,常常應用到一些遊戲中. 在Swift中我們可以有很多種選擇.這裡我只說兩種:一種是擴充套件Array的功能,另外一種是利用GameplayKit中的內建方法. 首先上程式碼: extension Array

快速排序-常見中軸(主元pivot)選擇方法及實現程式碼(末位/隨機/三數中值/..)

一、選取最後一個元素 在我們的課本中,看到最多的就是選擇第一個元素作為中軸,但是在很多書上卻選擇最後一個元素作為中軸。下面就讓我們來一睹選取最後一個元素作為中軸的快排。 注:本文中的所有演算法都採用雙向掃描法,即,設兩個下標i和j,i和右掃描,j向左掃描,直到i不小