欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言簡明講解快速排序的應(yīng)用

 更新時(shí)間:2022年05月21日 11:28:50   作者:Mi ronin  
快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經(jīng)常被采用,再加上快速排序思想----分治法也確實(shí)實(shí)用,因此很多軟件公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個(gè),還有大大小的程序方面的考試如軟考,考研中也常常出現(xiàn)快速排序的身影

快速排序

快速排序,說白了就是給基準(zhǔn)數(shù)據(jù)找其正確索引位置的過程

1.1快速排序引入

希爾排序相當(dāng)于直接插入排序的升級(jí),他們屬于插入排序類;堆排序相當(dāng)于簡單選擇排序的升級(jí),他們同屬于選擇排序類;而對(duì)于交換排序類的冒泡排序升級(jí)版本就是快速排序。

1.2快速排序的基本思想

通過一趟排序?qū)⒋庞涗浄指畛瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字比另一部分記錄的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)排序的目的。

1.3快速排序的排序流程

  • 首先設(shè)定一個(gè)分界值,通過該分界值將數(shù)組分成左右兩部分。
  • 將大于或等于分界值的數(shù)據(jù)集中到數(shù)組右邊,小于分界值的數(shù)據(jù)集中到數(shù)組的左邊。此時(shí),左邊部分中各元素都小于或等于分界值,而右邊部分中各元素都大于或等于分界值。
  • 然后,左邊和右邊的數(shù)據(jù)可以獨(dú)立排序。對(duì)于左側(cè)的數(shù)組數(shù)據(jù),又可以取一個(gè)分界值,將該部分?jǐn)?shù)據(jù)分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側(cè)的數(shù)組數(shù)據(jù)也可以做類似處理。
  • 重復(fù)上述過程,可以看出,這是一個(gè)遞歸定義。通過遞歸將左側(cè)部分排好序后,再遞歸排好右側(cè)部分的順序。當(dāng)左、右兩個(gè)部分各數(shù)據(jù)排序完成后,整個(gè)數(shù)組的排序也就完成了。

總結(jié)來說:就是分治+填數(shù)

1.4實(shí)例說明

以12、10、8、22、5、13、28、21、11我們要將它按從小到大排序排序過程:

詳細(xì)過程:

設(shè)定兩個(gè)指針 left 和 right,它們初始分別指向待排序序列的左端和右端;此外還要附設(shè)一個(gè)基準(zhǔn)元素 tmp(一般選取第一個(gè),本例中基準(zhǔn)tmp的值為 20)。

首先從 right 所指的位置從右向左搜索找到第一個(gè)小于 tmp 的元素,然后將其記錄在基準(zhǔn)元素所在的位置。

接著從 left 所指的位置從左向右搜索找到第一個(gè)大于 tmp的元素,然后將其記錄在 right 所指向的位置。

然后再從 right 所指向的位置繼續(xù)從右向左搜索找到第一個(gè)小于 tmp 的元素,然后將其記錄在 left 所指向的位置。

接著,left 繼續(xù)從左向右搜索第一個(gè)大于 tmp的元素,如果在搜索過程中出現(xiàn)了 left == right ,則說明一趟快速排序結(jié)束。此時(shí)將 tmp 記錄在 left 和 right 共同指向的位置即可。

以上便是一輪快速排序的詳細(xì)過程

注意:

  1. 向下劃分至少需要這個(gè)組兩個(gè)數(shù)據(jù),才有必要?jiǎng)澐郑?個(gè)或者1個(gè)都沒有必要
  2. 劃分時(shí):從右向左找比基準(zhǔn)小的(相等)
  3. 從左向右找比基準(zhǔn)值大的

1.5代碼實(shí)現(xiàn)

//一次劃分函數(shù)  核心函數(shù)  //返回基準(zhǔn)值最終所在下標(biāo)
int Partition(int *arr, int left, int right)
{
	//先講arr數(shù)組里的[left, right]的第一個(gè)值 作為基準(zhǔn)值
	int tmp = arr[left];
	while(left < right)
	{
		while(left<right && arr[right] > tmp)//左右邊界沒有相遇且當(dāng)前右邊的值大于基準(zhǔn)值tmp
		right--;
		if(left < right)//如果此時(shí),左右邊界沒有相遇,那就只能證明右邊right找到了一個(gè)小于等于基準(zhǔn)值tmp的值
		{
			arr[left] = arr[right];
		}
		else
		{
			break;
		}
		while(left<right && arr[left] <= tmp)//左右邊界沒有相遇且當(dāng)前左邊的值小于等于基準(zhǔn)值tmp
		left++;
		if(left < right)//如果此時(shí),左右邊界沒有相遇,那就只能證明左邊left找到了一個(gè)大于基準(zhǔn)值tmp的值
		{
			arr[right] = arr[left];
		}
		else
		{
			break;
		}
	}
	arr[left] = tmp;//此時(shí) 因?yàn)?left == right
	return left;//return right ok
}
void Quick(int *arr, int left, int right)
{
	if(left < right)//通過left <right  保證[left, right]這個(gè)范圍內(nèi)至少兩個(gè)數(shù)據(jù)
	{
		int par = Partition(arr, left, right);
		if(left < par-1)//基準(zhǔn)值左半部分  至少有兩個(gè)值才有必要去遞歸
		{
			Quick(arr, left, par-1);
		}
		if(par+1 < right)//基準(zhǔn)值右半部分  至少有兩個(gè)值才有必要去遞歸
		{
			Quick(arr, par+1, right);
		}
	}
}
void QuickSort(int *arr, int len)
{
	Quick(arr, 0, len-1);
}

1.6性能分析

越亂越快,越有序越慢

時(shí)間復(fù)雜度:

最優(yōu)情況:O(nlogn)每次數(shù)據(jù)元素都能平均的分成兩個(gè)部分。得到一個(gè)完全二叉樹;

最壞情況: O(n^2)這個(gè)數(shù)僅有右子樹或左子樹,比較次數(shù)為 (n-1)+(n-2) + (n-3) + … +1=n*(n-1)/2 ;

平均情況:O(nlogn)。

空間復(fù)雜度:O(1)。

穩(wěn)定性:因?yàn)殛P(guān)鍵字的比較和交換是跳躍進(jìn)行的,會(huì)改變數(shù)據(jù)元素的相對(duì)位置;因此,快速排序是一種不穩(wěn)定的排序方法,但是也是內(nèi)排序中平均效率最高的排序算法。

(小白一位,如有錯(cuò)誤歡迎指正)

到此這篇關(guān)于C語言簡明講解快速排序的應(yīng)用的文章就介紹到這了,更多相關(guān)C語言快速排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何基于C語言socket編程實(shí)現(xiàn)TCP通信

    如何基于C語言socket編程實(shí)現(xiàn)TCP通信

    本文介紹了如何基于C語言socket編程實(shí)現(xiàn)TCP通信,下面小編來簡單介紹下
    2019-05-05
  • 人臉檢測(cè)中AdaBoost算法詳解

    人臉檢測(cè)中AdaBoost算法詳解

    這篇文章主要為大家詳細(xì)介紹了人臉檢測(cè)中AdaBoost算法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言詳解分析進(jìn)程控制中進(jìn)程終止的實(shí)現(xiàn)

    C語言詳解分析進(jìn)程控制中進(jìn)程終止的實(shí)現(xiàn)

    當(dāng)進(jìn)程完成執(zhí)行最后語句并且通過系統(tǒng)調(diào)用 exit() 請(qǐng)求操作系統(tǒng)刪除自身時(shí),進(jìn)程終止。這時(shí),進(jìn)程可以返回狀態(tài)值(通常為整數(shù))到父進(jìn)程(通過系統(tǒng)調(diào)用 wait())。所有進(jìn)程資源,如物理和虛擬內(nèi)存、打開文件和 I/O 緩沖區(qū)等,會(huì)由操作系統(tǒng)釋放
    2022-08-08
  • c語言實(shí)現(xiàn)整蠱朋友小程序(附源碼)

    c語言實(shí)現(xiàn)整蠱朋友小程序(附源碼)

    這篇文章主要給大家介紹了關(guān)于c語言實(shí)現(xiàn)整蠱朋友小程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C++學(xué)習(xí)進(jìn)階之Makefile基礎(chǔ)用法詳解

    C++學(xué)習(xí)進(jìn)階之Makefile基礎(chǔ)用法詳解

    Makefile 通常指的是一個(gè)含有一系列命令(directive)的,通過 Make自動(dòng)化編譯工具,幫助 C/C++ 程序?qū)崿F(xiàn)自動(dòng)編譯目標(biāo)文件的文件,這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)進(jìn)階之Makefile基礎(chǔ)用法的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C語言實(shí)現(xiàn)文件版通訊錄的代碼分享

    C語言實(shí)現(xiàn)文件版通訊錄的代碼分享

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)一個(gè)文件版通訊錄,主要運(yùn)用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語句等等知識(shí),需要的可以參考一下
    2023-01-01
  • Qt快速讀取大文件最后一行內(nèi)容解決方案

    Qt快速讀取大文件最后一行內(nèi)容解決方案

    這篇文章主要給大家介紹了關(guān)于Qt如何快速讀取大文件最后一行內(nèi)容的解決方案,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Qt具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • C語言嵌入式實(shí)現(xiàn)支持浮點(diǎn)輸出的printf示例詳解

    C語言嵌入式實(shí)現(xiàn)支持浮點(diǎn)輸出的printf示例詳解

    這篇文章主要為大家介紹了C語言嵌入式實(shí)現(xiàn)支持浮點(diǎn)輸出的printf示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • C++實(shí)現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))

    C++實(shí)現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))
    2021-07-07
  • c++中深淺拷貝以及寫時(shí)拷貝的實(shí)現(xiàn)示例代碼

    c++中深淺拷貝以及寫時(shí)拷貝的實(shí)現(xiàn)示例代碼

    這篇文章主要給大家介紹了關(guān)于c++中深淺拷貝以及寫時(shí)拷貝實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08

最新評(píng)論