最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言簡明講解快速排序的應用

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

快速排序

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

1.1快速排序引入

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

1.2快速排序的基本思想

通過一趟排序?qū)⒋庞涗浄指畛瑟毩⒌膬刹糠?,其中一部分記錄的關鍵字比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個排序的目的。

1.3快速排序的排序流程

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

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

1.4實例說明

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

詳細過程:

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

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

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

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

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

以上便是一輪快速排序的詳細過程

注意:

  1. 向下劃分至少需要這個組兩個數(shù)據(jù),才有必要劃分,0個或者1個都沒有必要
  2. 劃分時:從右向左找比基準小的(相等)
  3. 從左向右找比基準值大的

1.5代碼實現(xiàn)

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

1.6性能分析

越亂越快,越有序越慢

時間復雜度:

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

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

平均情況:O(nlogn)。

空間復雜度:O(1)。

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

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

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

相關文章

  • C++深入探究不同的繼承體系

    C++深入探究不同的繼承體系

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對父類的允許訪問的方法實行的過程進行重新編寫,返回值和形參都不能改變。就是對原本的父類進行重新編寫,但是外部接口不能被重寫
    2022-05-05
  • C++ vector類的模擬實現(xiàn)方法

    C++ vector類的模擬實現(xiàn)方法

    這篇文章主要介紹了C++ vector類的模擬實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • C++ std::list的merge()使用方式與分析

    C++ std::list的merge()使用方式與分析

    這篇文章主要介紹了C++ std::list的merge()使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • C語言實現(xiàn)輸出1000以內(nèi)的所有完全數(shù)

    C語言實現(xiàn)輸出1000以內(nèi)的所有完全數(shù)

    這篇文章主要介紹了C語言實現(xiàn)輸出1000以內(nèi)的所有完全數(shù),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 用C實現(xiàn)添加和讀取配置文件函數(shù)

    用C實現(xiàn)添加和讀取配置文件函數(shù)

    本篇文章是對用C語言實現(xiàn)添加和讀取配置文件函數(shù)的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ 遍歷二叉樹實例詳解

    C++ 遍歷二叉樹實例詳解

    這篇文章主要介紹了C++ 遍歷二叉樹實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • 利用Matlab一鍵生成工地海報特效

    利用Matlab一鍵生成工地海報特效

    這篇文章主要介紹了如何利用Matlab制作出工地海報的特效,文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • 一篇文章帶你入門C++的異常處理

    一篇文章帶你入門C++的異常處理

    C++ 提供了異常機制,讓我們能夠捕獲運行時錯誤,本文就詳細的介紹了C++異常處理入門,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++實現(xiàn)圖書管理系統(tǒng)課程設計(面向?qū)ο?

    C++實現(xiàn)圖書管理系統(tǒng)課程設計(面向?qū)ο?

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖書管理系統(tǒng)課程設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 雙向鏈表插入刪除基本應用介紹

    雙向鏈表插入刪除基本應用介紹

    本文將詳細介紹建立雙向鏈表,實現(xiàn)對雙向鏈表的插入,刪除操作,需要了解的朋友可以參考下
    2012-11-11

最新評論

襄汾县| 无为县| 健康| 武安市| 留坝县| 南昌县| 汝阳县| 大连市| 资源县| 横峰县| 洪泽县| 周口市| 高碑店市| 巴楚县| 肇州县| 彭水| 磐安县| 和硕县| 泊头市| 锡林浩特市| 南宁市| 武川县| 霍邱县| 滁州市| 新郑市| 马关县| 克山县| 嫩江县| 安阳县| 礼泉县| 中西区| 七台河市| 郑州市| 上饶市| 渝中区| 江达县| 平定县| 交口县| 社会| 宜良县| 弥勒县|