国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

快速排序算法C++實(shí)現(xiàn)(超詳細(xì)解析?。。。。?/h1>

這篇具有很好參考價(jià)值的文章主要介紹了快速排序算法C++實(shí)現(xiàn)(超詳細(xì)解析?。。。。?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一、前言

(1)分治算法

(2)分治算法解題方法

? ? 1.分解:

? ? 2.治理:

? ? 3.合并:

二、快速排序

1.問題分析

2.算法設(shè)計(jì)

? ? (1)分解:

? ? (2)治理 :

? ? (3)合并:

? ? (4)基準(zhǔn)元素的選?。?/p>

3.算法分析

三、AC代碼

?四、共勉


一、前言

(1)分治算法

? ? 快速排序,其實(shí)是一種分治算法,那么在了解快速排序之前,我們先來(lái)看看什么是分治算法。在算法設(shè)計(jì)中,我們引入分而治之的策略,稱為分治算法,其本質(zhì)就是將一個(gè)大規(guī)模的問題分解為若干個(gè)規(guī)模較小的相同子問題,分而治之。

(2)分治算法解題方法

? ? 1.分解:

? ? 將要解決的問題分解為若干個(gè)規(guī)模較小、相互獨(dú)立、與原問題形式相同的子問題。

? ? 2.治理:

? ? 求解各個(gè)子問題。由于各個(gè)子問題與原問題形式相同,只是規(guī)模較小而已,而當(dāng)子問題劃分得足夠小時(shí),就可以用簡(jiǎn)單的方法解決。

? ? 3.合并:

? ? 按原問題的要求,將子問題的解逐層合并構(gòu)成原問題的解。

二、快速排序

1.問題分析

? ? 快速排序是比較快的排序方法。它的基本思想是通過一組排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此使所有數(shù)據(jù)變成有序序列。

2.算法設(shè)計(jì)

? ? (1)分解:

? ??先從數(shù)列中取出一個(gè)元素作為基準(zhǔn)元素。一基準(zhǔn)元素為標(biāo)準(zhǔn),將問題分解為兩個(gè)子序列,使小于或者等于基準(zhǔn)元素的子序列在左側(cè),使大于基準(zhǔn)元素的子序列在右側(cè)。

? ? (2)治理 :

? ??對(duì)兩個(gè)子序列進(jìn)行快速排序(遞歸快速排序)。

? ? (3)合并:

? ? 將排好的兩個(gè)子序列合并在一起,得到原問題的解。

? ? (4)基準(zhǔn)元素的選?。?/h4>

? ? ①:取第一個(gè)元素。(通常選取第一個(gè)元素)

? ? ②:取最后一個(gè)元素

? ? ③:取中間位置的元素

? ? ④:取第一個(gè)、最后一個(gè)、中間位置元素三者之中位數(shù)

? ? ⑤:取第一個(gè)和最后一個(gè)之間位置的隨機(jī)數(shù) k (low<=k<=hight)

3.算法分析

? ? 假設(shè)當(dāng)前的待排序的序列為 R[low,hight] ,?其中 low<=hight。同時(shí)選取首元素為基準(zhǔn)元素。

步驟一:選取首元素的第一個(gè)元素作為基準(zhǔn)元素? pivot=R[low] ,i=low ,j=hight。

步驟二:從右向左掃描,找到小于等于 pivot 的數(shù),如果找到,R[i] 和 R[j] 交換 ,i++。

步驟三:從左向右掃描,找到大于 pivot 的數(shù),如果找到,R[i] 和 R[j] 交換,j--。

步驟四:重復(fù) 步驟二~步驟三,直到? j 與?i 的指針重合 返回位置 mid=i ,該位置的數(shù)正好是 pivot 元素。

? ? 至此換成一趟排序,此時(shí)以 mid 為界線,將數(shù)據(jù)分割為兩個(gè)子序列,左側(cè)子序列都比 pivot 數(shù)小,右側(cè)子序列都比 pivot 數(shù)大,然后再分別對(duì)這兩個(gè)子序列進(jìn)行快速排序。??

? ? 下面我將以序列(30,24,5,58,18,36,12,42,39)為例,進(jìn)行圖解。

(1)初始化。i=low ,j=hight,pivot=R[low]=30。如下圖所示:

c++快速排序,排序,分治算法,c++,算法,排序算法

?(2)向左走,從數(shù)組的右邊位置向左找,一直找到小于等于 pivot 的數(shù),找到R[j]=12,R[i]與R[j]交換,i++。如下圖所示:

c++快速排序,排序,分治算法,c++,算法,排序算法

?c++快速排序,排序,分治算法,c++,算法,排序算法

(3)向右走,從數(shù)組的左邊位置向右找,一直找到比 pivot 大的數(shù),找到 R[i]=58 ,R[i] 與 R[j] 交換?,j--。

c++快速排序,排序,分治算法,c++,算法,排序算法

c++快速排序,排序,分治算法,c++,算法,排序算法?(4)向左走,從數(shù)組的右邊位置向左找,一直找到小于等于 pivot 的數(shù),找到R[j]=18,R[i]與R[j]交換,i++。如下圖所示:

?c++快速排序,排序,分治算法,c++,算法,排序算法

c++快速排序,排序,分治算法,c++,算法,排序算法?(5)向右走,從數(shù)組的左邊位置向右找,一直找到比 pivot 大的數(shù),這是 i=j,第一輪排序結(jié)束,返回 i 的位置,mid=i 。以上的操作是對(duì)序列進(jìn)行分解,其代碼如下圖所示:

int part(int* r, int low, int hight)  //劃分函數(shù)
{
	int i = low, j = hight, pivot = r[low]; //基準(zhǔn)元素
	while (i < j)
	{
		while (i<j && r[j]>pivot) //從右向左開始找一個(gè) 小于等于 pivot的數(shù)值
		{
			j--;
		}
		if (i < j)
		{
			swap(r[i++], r[j]);  //r[i]和r[j]交換后 i 向右移動(dòng)一位
		}
		while (i < j && r[i] <= pivot) //從左向右開始找一個(gè) 大于 pivot的數(shù)值
		{
			i++;
		}
		if (i < j)
		{
			swap(r[i], r[j--]);  //r[i]和r[j]交換后 i 向左移動(dòng)一位
		}
	}
	return i;  //返回最終劃分完成后基準(zhǔn)元素所在的位置
}

(6)然后在分別對(duì)這兩個(gè)序列(12,24,5,18)和(36,58,42,39)進(jìn)行快速排序(遞歸)。其代碼如下圖所示:

void Quicksort(int* r, int low, int hight)
{
	int mid;
	if (low < hight)
	{
		mid = part(r, low, hight);  // 返回基準(zhǔn)元素位置
		Quicksort(r, low, mid - 1); // 左區(qū)間遞歸快速排序
		Quicksort(r, mid+1, hight); // 右區(qū)間遞歸快速排序
	}
}

三、AC代碼

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
int part(int* r, int low, int hight)  //劃分函數(shù)
{
	int i = low, j = hight, pivot = r[low]; //基準(zhǔn)元素
	while (i < j)
	{
		while (i<j && r[j]>pivot) //從右向左開始找一個(gè) 小于等于 pivot的數(shù)值
		{
			j--;
		}
		if (i < j)
		{
			swap(r[i++], r[j]);  //r[i]和r[j]交換后 i 向右移動(dòng)一位
		}
		while (i < j && r[i] <= pivot) //從左向右開始找一個(gè) 大于 pivot的數(shù)值
		{
			i++;
		}
		if (i < j)
		{
			swap(r[i], r[j--]);  //r[i]和r[j]交換后 i 向左移動(dòng)一位
		}
	}
	return i;  //返回最終劃分完成后基準(zhǔn)元素所在的位置
}
void Quicksort(int* r, int low, int hight)
{
	int mid;
	if (low < hight)
	{
		mid = part(r, low, hight);  // 返回基準(zhǔn)元素位置
		Quicksort(r, low, mid - 1); // 左區(qū)間遞歸快速排序
		Quicksort(r, mid+1, hight); // 右區(qū)間遞歸快速排序
	}
}
int main()
{
	int a[10001];
	int  N;
	cout << "請(qǐng)輸入要排序的數(shù)據(jù)的個(gè)數(shù): " << endl;
	cin >> N;
	cout << "請(qǐng)輸入要排序的數(shù)據(jù): " << endl;
	for (int i = 0; i < N; i++)
	{
		cin >> a[i];
	}
	cout << endl;
	Quicksort(a, 0, N - 1);
	cout << "排序后的序列為: " << endl;
	for (int i = 0; i < N; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

c++快速排序,排序,分治算法,c++,算法,排序算法

?四、共勉

? ? 以下就是我對(duì)分治:快速排序的理解,如果有不懂和發(fā)現(xiàn)問題的小伙伴,請(qǐng)?jiān)谠u(píng)論區(qū)說(shuō)出來(lái)哦,同時(shí)我還會(huì)繼續(xù)更新對(duì)分治算法的理解,請(qǐng)持續(xù)關(guān)注我哦?。。。。。。?!

c++快速排序,排序,分治算法,c++,算法,排序算法

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-778741.html

到了這里,關(guān)于快速排序算法C++實(shí)現(xiàn)(超詳細(xì)解析?。。。。┑奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++算法之快速排序

    C++算法之快速排序

    我們知道,給一個(gè)長(zhǎng)度為n的序列排序,有三種很簡(jiǎn)單的算法:選擇排序、冒泡排序、插入排序。這三種算法的復(fù)雜度均為 O(n^2) 。 如果按照計(jì)算機(jī) 1 秒鐘可以進(jìn)行 10^8 次計(jì)算作為參照,那么它1秒之內(nèi)可以排序的序列長(zhǎng)度大概為 10^4 這個(gè)數(shù)量級(jí)。 然而,在實(shí)際生活中, 10^4 級(jí)

    2024年02月10日
    瀏覽(13)
  • 進(jìn)程調(diào)度算法——C++實(shí)現(xiàn) [ FCFS,SJF,HPR,HRN + 開源代碼 + 詳細(xì)解析 ]

    進(jìn)程調(diào)度算法——C++實(shí)現(xiàn) [ FCFS,SJF,HPR,HRN + 開源代碼 + 詳細(xì)解析 ]

    ? (原創(chuàng),庫(kù)存,第100篇博客,紀(jì)念一下) (1) 先來(lái)先服務(wù)算法FCFS (First Come First Service):即調(diào)度程序只靠率一個(gè)參數(shù)———作業(yè)到達(dá)系統(tǒng)的時(shí)間,誰(shuí)先到就先給誰(shuí)提供服務(wù)。 (2) 最短作業(yè)優(yōu)先算法SJF (Shortest Job First):即我們也只考慮一個(gè)參數(shù)———進(jìn)程的CPU的執(zhí)行時(shí)間,計(jì)算量

    2023年04月13日
    瀏覽(14)
  • 用Python實(shí)現(xiàn)快速排序和冒泡排序,代碼+詳細(xì)解析

    1、冒泡排序 ????????冒泡排序:每一次相鄰的兩個(gè)數(shù)做比較,大的往后移動(dòng)一位,每次循環(huán)都會(huì)把最大的值(升序)或最小的值(降序)放在末端 。 2、快速排序 ????????快速排序使用分治法(Divide and conquer)策略來(lái)把一個(gè)序列(list)分為較小和較大的2個(gè)子序列,然后遞歸地

    2024年02月11日
    瀏覽(18)
  • 【C++實(shí)現(xiàn)插入排序、希爾排序、冒泡排序、快速排序、選擇排序】

    【C++實(shí)現(xiàn)插入排序、希爾排序、冒泡排序、快速排序、選擇排序】

    使用C++實(shí)現(xiàn)來(lái)插入排序、希爾排序、冒泡排序、快速排序、選擇排序算法。 插入排序,一般也被稱為直接插入排序。對(duì)于少量元素的排序,它是一個(gè)有效的算法 。插入排序是一種最簡(jiǎn)單的排序方法,它的基本思想是將一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而生成一個(gè)新

    2024年02月06日
    瀏覽(31)
  • c++排序算法——冒泡排序(不會(huì)的一定要看,超級(jí)詳細(xì))

    c++排序算法——冒泡排序(不會(huì)的一定要看,超級(jí)詳細(xì))

    今天,我們來(lái)學(xué)習(xí)一種排序算法—— 冒泡排序 。 首先,先問三個(gè)問題: 想象一下,如果字典不是按照字母順序排列,查找一個(gè)單詞,你得查到什么時(shí)候?這就是為什么人們引入了分類的概念,因?yàn)槠?極大地幫助我們快速搜索物品 。 或者說(shuō),排序是一種常用的整理信息的方

    2024年02月16日
    瀏覽(22)
  • C++算法 —— 分治(2)歸并

    C++算法 —— 分治(2)歸并

    本篇前提條件是已學(xué)會(huì)歸并排序 912. 排序數(shù)組 排序數(shù)組也可以用歸并排序來(lái)做。 劍指 Offer 51. 數(shù)組中的逆序?qū)?如果暴力枚舉,一定是可以解決問題的,但肯定不用這個(gè)解法。選擇逆序?qū)Γ梢韵劝褦?shù)組分成兩部分,左半部分 + 右半部分的逆序?qū)Γ约霸僬易蟀氩糠值臄?shù)字和

    2024年02月10日
    瀏覽(23)
  • 【C++算法模板】圖論-拓?fù)渑判?,超詳?xì)注釋帶例題

    【C++算法模板】圖論-拓?fù)渑判?,超詳?xì)注釋帶例題

    推薦視頻鏈接:D01 拓?fù)渑判?給定一張 有向無(wú)環(huán)圖 ,排出所有頂點(diǎn)的一個(gè)序列 A A A 滿足:對(duì)于圖中的每條有向邊 ( x , y ) (x,y) ( x , y ) , x x x 在 A A A 中都出現(xiàn)在 y y y 之前,則稱 A A A 是該圖的頂點(diǎn)的一個(gè)拓?fù)湫?拓?fù)渑判?可以判斷有向圖中是否有環(huán),可以生成拓?fù)湫蛄?對(duì)于下

    2024年04月15日
    瀏覽(14)
  • 【C語(yǔ)言】解析C語(yǔ)言實(shí)現(xiàn)排序的算法(冒泡排序、插入排序、選擇排序、快速排序、歸并排序)

    本博客主要圍繞五種常見的排序算法展開討論,包括選擇排序、快速排序、歸并排序、冒泡排序和插入排序。針對(duì)每種算法,我對(duì)其思想、特點(diǎn)、時(shí)間復(fù)雜度、穩(wěn)定性以及優(yōu)缺點(diǎn)進(jìn)行了詳細(xì)解釋和比較。 冒泡排序算法是一種簡(jiǎn)單且常用的排序算法。它通過重復(fù)地交換相鄰的元

    2024年02月13日
    瀏覽(23)
  • C++:分治算法之輸油管道問題

    C++:分治算法之輸油管道問題

    目錄 描述 輸入 輸出 輸入樣例 輸出樣例 分析 代碼 運(yùn)行結(jié)果 ¢ 某石油公司計(jì)劃建造一條 由東向西 的主輸油管道。該管道要穿過一個(gè)有 n 口油井的油田。從每口油井都要有一條輸油管道沿最短路經(jīng)(或南或北)與主管道相連。 ¢ 如果給定 n 口油井的位置,即它們的 x 坐標(biāo)(

    2024年02月02日
    瀏覽(24)
  • 【算法篇C++實(shí)現(xiàn)】常見排序算法

    【算法篇C++實(shí)現(xiàn)】常見排序算法

    算法精煉 每趟從待排序的記錄中選出最小的記錄,順序放在已排序的記錄序列末尾,直到全部排序結(jié)束為止。 簡(jiǎn)單排序處理流程 從待排序序列中,找到最小的元素; 如果最小元素不是待排序序列的第一個(gè)元素,將其和第一個(gè)元素互換; 從余下的 N - 1 個(gè)元素中

    2024年02月13日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包