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

快速排序到底有多快

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

作者主頁(yè):paper jie的博客_CSDN博客-C語(yǔ)言,算法詳解領(lǐng)域博主

本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。

本文錄入于《算法詳解》專欄,本專欄是針對(duì)于大學(xué)生,編程小白精心打造的。筆者用重金(時(shí)間和精力)打造,將算法基礎(chǔ)知識(shí)一網(wǎng)打盡,希望可以幫到讀者們哦。

其他專欄:《系統(tǒng)解析C語(yǔ)言》《C語(yǔ)言》《C語(yǔ)言-語(yǔ)法篇》

內(nèi)容分享:本期將對(duì)八大排序中的快速排序進(jìn)行詳細(xì)的講解,各位看官姥爺快搬好小板凳坐好叭。

? ? -------- 不要998,不要98,只要一鍵三連,三連買不了吃虧,買不了上當(dāng)

前言

在之前的排序中,我們對(duì)交換排序中的冒泡排序進(jìn)行了講解,帶學(xué)習(xí)的過(guò)程中,我們發(fā)現(xiàn)一個(gè)問(wèn)題,冒泡排序的速度實(shí)在是太慢了,它是兩個(gè)兩個(gè)元素進(jìn)行比較。那有沒有比這種排序更快的算法呢?當(dāng)然是有的,就是今天我們講的快速排序。

什么是快速排序

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列??焖倥判蚴菍?duì)冒泡排序的一種改進(jìn),大大的提升了排序的速度。

快速排序的實(shí)現(xiàn)

基本思想

定義一個(gè)中心軸pivot

將小于pivot的元素放在左邊

將大于pivot的元素放在右邊

將子數(shù)組用遞歸重復(fù)上面三步驟

具體代碼

#include <stdio.h>

void Quick_Sort(int arr[], int l, int r)
{
	//如果就子數(shù)組就一個(gè)元素了,那它本身就是有序的
	//直接返回
	if (l >= r)
		return;
	int left = l;
	int right = r;
	//設(shè)置最左邊的為基準(zhǔn)軸
	int pivot = arr[left];

	while (left < right)
	{
		//從右邊開始比較
		//大于pivot,right就--再比較前一個(gè)元素
		while (left < right && arr[right] > pivot)
		{
			right--;
		}
		//要是小于基準(zhǔn)軸就將它放到left指向的元素
		//因?yàn)檫@個(gè)元素已經(jīng)比pivot小了,left++跳過(guò)它
		if (left < right)
		{
			arr[left] = arr[right];
			left++;
		}
		//再?gòu)淖筮呴_始比較
		//小于pivot,left就++
		while (left < right && arr[left] < pivot)
		{
			left++;
		}
		//要是大于pivot,就將它放到right指向的元素
		//再right--,因?yàn)檫@個(gè)元素已經(jīng)知道大于pivot了
		if (left < right)
		{
			arr[right] = arr[left];
			right--;
		}
		//當(dāng)兩個(gè)指針重合時(shí),將pivot放入其中
		//這時(shí)比它小的都在左邊,比他大的都在右邊
		if (left >= right)
		{
			arr[left] = pivot;
		}
	}
	//遞歸處理左邊的子數(shù)組
	Quick_Sort(arr, l, right - 1);
	//遞歸處理右邊的子數(shù)組
	Quick_Sort(arr, right + 1, r);

}
int main()
{
	int arr[] = { 3,2,5,8,7,1,4,6,0,9 };
	int l = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int r = sz - 1;
	//快速排序
	Quick_Sort(arr, l, r);
	//打印
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

快速排序?qū)崿F(xiàn)的原理

排序算法的思想非常簡(jiǎn)單,在排序的數(shù)列中,我們首先要找一個(gè)數(shù)字作為基準(zhǔn)數(shù)為了方便,我們一般選擇第 1 個(gè)數(shù)字作為基準(zhǔn)數(shù)。接下來(lái)我們需要把這個(gè)待排序的數(shù)列中小于基準(zhǔn)數(shù)的元素移動(dòng)到待排序的數(shù)列的左邊,把大于基準(zhǔn)數(shù)的元素移動(dòng)到待排序的數(shù)列的右邊。這時(shí),左右兩個(gè)分區(qū)的元素就相對(duì)有序了;接著把兩個(gè)分區(qū)的元素分別按照上面兩種方法繼續(xù)對(duì)每個(gè)分區(qū)找出基準(zhǔn)數(shù),然后移動(dòng),直到各個(gè)分區(qū)只有一個(gè)數(shù)時(shí)為止。

這是典型的分治思想,即分治法。下面我們代碼中的例子進(jìn)行算法描述,講解快速排序的排序步驟。

以 3 2?5 8 7 1 4 6 0 9的待排序的數(shù)列為例進(jìn)行排序。首先我們需要在數(shù)列中選擇一個(gè)基準(zhǔn)數(shù),我們一般會(huì)選擇中間的一個(gè)數(shù)或者頭尾的數(shù),這里直接選擇第 1 個(gè)數(shù) 3作為基準(zhǔn)數(shù),接著把比 3小的數(shù)字移動(dòng)到左邊,把比 3大的數(shù)字移動(dòng)到右邊,對(duì)于相等的數(shù)字不做移動(dòng)。所以實(shí)際上我們需要找到中間的某個(gè)位置 k,這樣 k 左邊的值全部比 k 上的值小,k 右邊的值全部比 k 上的值大。

接下來(lái)開始移動(dòng)元素。怎么移動(dòng)呢?其實(shí)冒泡排序也涉及對(duì)元素的移動(dòng),但是那樣移動(dòng)起來(lái)很累,比如把最后一個(gè)元素移動(dòng)到第 1 個(gè),就需要比較 n-1 次,同時(shí)交換 n-1 次,效率很低。其實(shí),只需把第 1 個(gè)元素和最后一個(gè)元素交換就好了,這種思想是不是在排序時(shí)可以借鑒呢?之前說(shuō)快速排序就是對(duì)冒泡排序的一個(gè)改進(jìn),就是這個(gè)原因。

快速排序的操作是這樣的:首先從數(shù)列的右邊開始往左邊找,我們?cè)O(shè)這個(gè)下標(biāo)為 i,也就是進(jìn)行減減操作(i--),找到第 1 個(gè)比基準(zhǔn)數(shù)小的值,讓它與基準(zhǔn)值交換;接著從左邊開始往右邊找,設(shè)這個(gè)下標(biāo)為 j,然后執(zhí)行加加操作(j++),找到第 1 個(gè)比基準(zhǔn)數(shù)大的值,讓它與基準(zhǔn)值交換;然后繼續(xù)尋找,直到 i 與 j 相遇時(shí)結(jié)束,最后基準(zhǔn)值所在的位置即 k 的位置,也就是說(shuō) k 左邊的值均比 k 上的值小,而 k 右邊的值都比 k 上的值大。

這樣就是一次比較,后面的子數(shù)組重復(fù)以上操作,到數(shù)組只有一個(gè)元素的時(shí)候就結(jié)束了,因?yàn)橐粋€(gè)數(shù)組它就是有序的。

畫圖理解:

快速排序到底有多快?

快速排序的特點(diǎn)與性能

快速排序是在冒泡排序的基礎(chǔ)上改進(jìn)而來(lái)的,冒泡排序每次只能交換相鄰的兩個(gè)元素,而快速排序是跳躍式的交換,交換的距離很大,因此總的比較和交換次數(shù)少了很多,速度也快了不少。
但是快速排序在最壞情況下的時(shí)間復(fù)雜度
和冒泡排序一樣,是?O(n2),實(shí)際上每次比較都需要交換,但是這種情況并不常見。我們可以思考一下如果每次比較都需要交換,那么數(shù)列的平均時(shí)間復(fù)雜度是?O(nlogn),事實(shí)上在大多數(shù)時(shí)候,排序的速度要快于這個(gè)平均時(shí)間復(fù)雜度。這種算法實(shí)際上是一種分治法思想,也就是分而治之,把問(wèn)題分為一個(gè)個(gè)的小部分來(lái)分別解決,再把結(jié)果組合起來(lái)。
快速排序只是使用數(shù)組原本的空間進(jìn)行排序,所以所占用的空間應(yīng)該是常量級(jí)的,但是由于每次劃分之后是遞歸調(diào)用,所以遞歸調(diào)用在運(yùn)行的過(guò)程中會(huì)消耗一定的空間,在一般情況下的空間復(fù)雜度為?O(logn),在最差的情況下,若每次只完成了一個(gè)元素,那么空間復(fù)雜度為?O(n)。所以我們一般認(rèn)為快速排序的空間復(fù)雜度為?O(logn)。
快速排序是一個(gè)不穩(wěn)定的算法,在經(jīng)過(guò)排序之后,可能會(huì)對(duì)相同值的元素的相對(duì)位置造成改變。
快速排序基本上被認(rèn)為是相同數(shù)量級(jí)的所有排序算法中,平均性能最好的。
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-498801.html


到了這里,關(guān)于快速排序到底有多快的文章就介紹完了。如果您還想了解更多內(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)文章

  • 用Spring Boot 3.2虛擬線程搭建靜態(tài)文件服務(wù)器有多快?

    用Spring Boot 3.2虛擬線程搭建靜態(tài)文件服務(wù)器有多快?

    Spring Boot 3.2 于 2023 年 11 月大張旗鼓地發(fā)布,標(biāo)志著 Java 開發(fā)領(lǐng)域的一個(gè)關(guān)鍵時(shí)刻。這一突破性的版本引入了一系列革命性的功能,包括: 虛擬線程:利用 Project Loom 的虛擬線程釋放可擴(kuò)展性,從而減少資源消耗并增強(qiáng)并發(fā)性。 Native Image支持:通過(guò)Native Image編譯制作速度極快

    2024年02月03日
    瀏覽(26)
  • Chatgpt到底有多牛?

    Chatgpt到底有多牛?

    在人工智能領(lǐng)域, ChatGPT可以說(shuō)是最具影響力的 AI之一。從全球最大的中文搜索引擎百度,到中國(guó)最大的新聞聚合網(wǎng)站人民日?qǐng)?bào),再到中國(guó)最大的知識(shí)問(wèn)答網(wǎng)站知乎, ChatGPT都有不俗的表現(xiàn)。而在 ChatGPT被美國(guó)《時(shí)代周刊》評(píng)為“人工智能界的諾貝爾獎(jiǎng)”后,其在全球范圍內(nèi)的

    2023年04月25日
    瀏覽(18)
  • 碾壓GPT-4!Claude3到底有多強(qiáng)?

    碾壓GPT-4!Claude3到底有多強(qiáng)?

    2024年3月4日,官方宣布推出 Claude 3 模型系列,它在廣泛的認(rèn)知任務(wù)中樹立了新的行業(yè)基準(zhǔn)。該系列包括三個(gè)按能力遞增排序的最先進(jìn)模型:Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。每個(gè)后續(xù)模型都提供越來(lái)越強(qiáng)大的性能,允許用戶為其特定應(yīng)用選擇智能、速度和成本之間的最

    2024年03月12日
    瀏覽(27)
  • 常見的Linux發(fā)行版配置要求到底有多低?

    常見的Linux發(fā)行版配置要求到底有多低?

    常見的Linux發(fā)行版配置要求主要包括以下幾個(gè)方面: 一般來(lái)說(shuō),64位的Linux發(fā)行版需要至少2GHz的CPU速度,對(duì)于較老的處理器,可以選擇使用32位的Linux發(fā)行版。 Linux發(fā)行版通常需要至少1GB的RAM才能正常運(yùn)行,對(duì)于較老的處理器,可以選擇使用更低的RAM要求。 根據(jù)Linux發(fā)行版不同

    2024年02月07日
    瀏覽(20)
  • 技術(shù)宅小伙:ChatGPT的編程能力到底有多厲害?

    ? ? 歡迎大家光臨技術(shù)宅小伙的博客! ? ? 有特別多朋友問(wèn)我 ? ? 如何給自己制定一份 ? ? 行之有效的編程學(xué)習(xí)計(jì)劃 ? ? 我最近發(fā)現(xiàn)CHATGPT在這方面特別棒 ? ? 所以今天跟大家簡(jiǎn)單介紹一下 ? ? 如何用CHATGPT根據(jù)我們自身的特點(diǎn) ? ? 幫我們制定一份行之有效的學(xué)習(xí)規(guī)劃 ?

    2023年04月08日
    瀏覽(23)
  • 從入門到精通:30天速成黑客教程到底有多狠?

    從入門到精通:30天速成黑客教程到底有多狠?

    首先我談下對(duì)黑客網(wǎng)絡(luò)安全的認(rèn)知,其實(shí)最重要的是興趣熱愛,不同于網(wǎng)絡(luò)安全工程師,他們大都是培訓(xùn)機(jī)構(gòu)培訓(xùn)出來(lái)的,具備的基本都是防御和白帽子技能,他們絕大多數(shù)的人看的是工資,他們是為了就業(yè)而學(xué)習(xí),為了走捷徑才去參加培訓(xùn)。 而我進(jìn)大廠主要是靠自學(xué)內(nèi)推進(jìn)

    2024年02月07日
    瀏覽(16)
  • ChatGPT-5到底有多強(qiáng)?Battle!咱貌似也不輸呀!

    ChatGPT-5到底有多強(qiáng)?Battle!咱貌似也不輸呀!

    盤點(diǎn)今年的熱點(diǎn)話題,ChatGPT是不可避免要被反復(fù)提及的一part。從去年的-3.0到今年的-3.5,再到上月剛發(fā)布-4.0。從用戶體驗(yàn)和市場(chǎng)反饋來(lái)講,這半年的時(shí)間,ChatGPT每一步都走得又穩(wěn)又快! 回想起今年2月初ChatGPT全網(wǎng)爆火的時(shí)候,其實(shí)當(dāng)時(shí)心里是有點(diǎn)緊迫感的,不知道各位的感

    2024年02月01日
    瀏覽(14)
  • ChatGPT被淘汰了?Auto-GPT到底有多強(qiáng)

    ChatGPT被淘汰了?Auto-GPT到底有多強(qiáng)

    ? 大家好,我是可夫小子,關(guān)注AIGC、讀書和自媒體。解鎖更多ChatGPT、AI繪畫玩法。 ? 說(shuō)Auto-GPT淘汰了ChatGPT了,顯然是營(yíng)銷文案里面的標(biāo)題黨。畢竟它還是基于ChatGPT的API,某種意義只是基于ChatGPT能力的應(yīng)用。但最近,AutoGPT確實(shí)又成為一個(gè)現(xiàn)象級(jí)的事件,上線不到一個(gè)月,g

    2024年02月02日
    瀏覽(14)
  • Java工程師在IT行業(yè)到底有多受歡迎?

    Java工程師在IT行業(yè)到底有多受歡迎?

    在互聯(lián)網(wǎng)+的影響下,這幾年,在全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java工程師為何會(huì)如此火爆? 1、Java開發(fā)就業(yè)現(xiàn)狀以及發(fā)展前景 目前在軟件類崗位,Java軟件開發(fā)工程師所占的比例最大,達(dá)到60%以上。根據(jù)IDC的統(tǒng)計(jì)數(shù)字,在所有軟件開發(fā)類人才的需求中,對(duì)Java工程師

    2023年04月09日
    瀏覽(15)
  • KIMI爆了!對(duì)比文心一言和通義千問(wèn)它到底有多強(qiáng)?

    KIMI爆了!對(duì)比文心一言和通義千問(wèn)它到底有多強(qiáng)?

    原文:趙俠客 最近國(guó)產(chǎn)大模型KIMI爆了大部分人應(yīng)該都知道了,從我個(gè)人的感受來(lái)看這次KIMI爆了我不是從技術(shù)領(lǐng)域接觸到的,而是從各種金融領(lǐng)域接觸到的。目前國(guó)內(nèi)大模型可以說(shuō)是百模大戰(zhàn),前幾年新能源大戰(zhàn),今年資本割完韭菜后留給我們的是一家家倒閉或者即將要倒閉的

    2024年04月10日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包