C語言實現快速排序

什么是快速排序?

快速排序(Quick Sort) 是一種高效的分治法排序算法。它通過選擇一個基準元素,將數組分成小于基準的部分和大于基準的部分,然后遞歸地對這些部分進行排序,最終將它們合并起來,完成排序。

快速排序的步驟

1、選擇樞軸(基準元素):從待排序的數組中選擇一個元素作為樞軸。常見的選擇方式是取第一個元素、最后一個元素、隨機元素或通過三數取中法選擇中間值作為樞軸。

2、劃分操作:將數組中的元素按照與樞軸的大小關系進行劃分,將小于等于樞軸的元素放在樞軸的左側,大于樞軸的元素放在樞軸的右側。這一步驟通常使用雙指針法來實現,即從數組的兩端同時向中間遍歷,交換不符合條件的元素,直到兩個指針相遇。

3、遞歸排序:對劃分后的左側子數組和右側子數組分別進行遞歸調用快速排序算法,重復上述步驟,直到子數組的長度為1或為空,即無法再繼續劃分。

4、合并結果:當遞歸調用完成后,所有的子數組都已經有序。最后,將左側子數組、樞軸元素和右側子數組依次合并起來,即可得到完整的有序數組。

舉例說明

假設我們有以下待排序的數組:[49, 38, 65, 97, 76, 27, 13, 49]

1、選擇基準: 選擇數組的第一個元素 49 作為基準。

2、分割: 將數組分割成兩部分,小于 49 的部分為 [38, 27, 13],大于 49 的部分為 [65, 97, 76, 49]。

3、遞歸排序: 對小于基準的部分 [38, 27, 13] 進行遞歸排序。
????????????選擇基準: 在小于部分中,選擇第一個元素 38 作為基準。
????????????分割: 分割后,小于 38 的部分為 [27, 13],大于 38 的部分為空。
????????????遞歸排序: 對小于 38 的部分 [27, 13] 進行排序,得到 [13, 27]。

4、遞歸排序: 對大于基準的部分 [65, 97, 76, 49] 進行遞歸排序。
????????????選擇基準: 在大于部分中,選擇第一個元素 65 作為基準。
????????????分割: 分割后,小于 65 的部分為 [49],大于 65 的部分為 [97, 76]。
????????????遞歸排序: 對小于 65 的部分 [49] 進行排序,得到 [49]。
????????????遞歸排序: 對大于 65 的部分 [97, 76] 進行排序,得到 [76, 97]。

5、合并: 將小于基準的部分 [13, 27]、基準 38、大于基準的部分 [49] 合并,得到 [13, 27, 38, 49]。

6、合并: 將小于基準的部分 [13, 27, 38, 49]、基準 49、大于基準的部分 [65, 97, 76] 合并,得到 [13, 27, 38, 49, 65, 97, 76]。

最終,數組 [49, 38, 65, 97, 76, 27, 13, 49] 經過快速排序變為有序數組 [13, 27, 38, 49, 65, 76, 97, 49]。

示例代碼

#include <stdio.h>// 快速排序算法
void QuickSort(int A[], int low, int high);// 劃分函數:將數組劃分為兩個子數組
int Partition(int A[], int low, int high);// 交換數組中的兩個元素
void Swap(int A[],int a,int b);// 打印數組元素
void PrintfArray(int A[], int length);int main()
{int arr[] = {49, 38, 65, 97, 76, 27, 13, 49};int length = sizeof(arr) / sizeof(arr[0]);int i;QuickSort(arr, 0, length - 1);printf("排序后的數組:");PrintfArray(arr,length);return 0;
} 劃分函數的實現
//int Partition(int A[], int low, int high)
//{
//	int pivot = A[low];  // 選擇第一個元素作為樞軸
//	while (low < high)
//	{
//		// 從右向左找到第一個小于等于樞軸的元素
//		while (low < high && A[high] >= pivot)
//			--high;
//		A[low] = A[high];  // 將該元素放入樞軸左側
//
//		// 從左向右找到第一個大于等于樞軸的元素
//		while (low < high && A[low] <= pivot)
//			++low;
//		A[high] = A[low];  // 將該元素放入樞軸右側
//	}
//	A[low] = pivot;  // 將樞軸元素放入正確的位置
//	return low;  // 返回樞軸的最終位置
//} 快速排序算法的實現
//void QuickSort(int A[], int low, int high)
//{
//	if (low < high)
//	{
//		int pivotpos = Partition(A, low, high);  // 劃分數組
//		QuickSort(A, low, pivotpos - 1);  // 對樞軸左側子數組進行快速排序
//		QuickSort(A, pivotpos + 1, high);  // 對樞軸右側子數組進行快速排序
//	}
//}// 劃分函數的實現
// 參數:
//   A: 數組
//   start: 子數組的起始索引
//   end: 子數組的結束索引
// 返回值:
//   劃分后樞軸的索引位置// 規則:如果當前元素小于基準數時,首先分割指示器右移一位;
// 在A的基礎之上,如果當前元素下標大于分割指示器下標時,當前元素和分割指示器所指元素交換 
int Partition(int A[], int start, int end)
{if(start==end)return start;int pivot=start; // 選擇第一個元素作為樞軸int zoneIndex=start-1; // 將小于樞軸的元素放在左側區域Swap(A,pivot,end); // 將樞軸元素放到最右側int i;for(i=start; i<=end; i++) // 將小于等于樞軸的元素移到左側區域{if(A[i]<=A[end]){zoneIndex++;if(i>zoneIndex)Swap(A,i,zoneIndex);}}return zoneIndex;  // 返回樞軸的最終位置
}// 快速排序算法的實現
// 參數:
//   A: 數組
//   start: 子數組的起始索引
//   end: 子數組的結束索引
void QuickSort(int A[], int start, int end)
{int zoneIndex=Partition(A,start,end);  // 劃分數組if(zoneIndex>start)QuickSort(A,start,zoneIndex-1); // 對樞軸左側子數組進行快速排序if(zoneIndex<end)QuickSort(A,zoneIndex+1,end);  // 對樞軸右側子數組進行快速排序
}// 交換數組中的兩個元素
// 參數:
//   A: 數組
//   a, b: 需要交換的元素索引
void Swap(int A[],int a,int b)
{int temp;temp=A[a];A[a]=A[b];A[b]=temp;
}// 打印數組元素
// 參數:
//   A: 數組
//   length: 數組長度
void PrintfArray(int A[],int length)
{int i=0;for(i=0; i<length; i++){printf("%d ",A[i]);}printf("\n");
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38529.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38529.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38529.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【廣州華銳視點】VR警務教育實訓系統模擬真實場景進行實踐訓練

隨著科技的發展&#xff0c;虛擬現實技術在教育領域得到了廣泛的應用。VR警務教育實訓系統就是其中的一種應用&#xff0c;該系統由廣州華銳互動開發&#xff0c;可以模擬真實的警務場景&#xff0c;讓學生通過虛擬現實技術進行實踐訓練&#xff0c;提高學生的實踐能力和技能水…

.NET6使用微信小程序授權登錄,獲取手機號

1.在appsettings配置你的小程序配置信息 //微信小程序信息配置"WechatConfig": {"appid": "", //小程序ID"secret": "" //小程序秘鑰},2.請求接口時先獲取Access_token #region 獲取小程序的Access_tokenpublic object GetA…

Linux:shell腳本循環語句

目錄 一、循環含義 二、echo命令 三、for 3.1.將1到100累加求和 3.2批量添加用戶 3.3 根據IP地址檢查主機狀態 四、 while 和 until 4.1 猜價格 4.2 1-100求和 一、循環含義 循環含義 將某代碼段重復運行多次&#xff0c;通常有進入循環的條件和退出循環的條件 重復…

視頻匯聚平臺EasyCVR視頻監控播放平臺WebRTC流地址無法播放的問題解決方案

開源EasyDarwin視頻監控TSINGSEE青犀視頻平臺EasyCVR能在復雜的網絡環境中&#xff0c;將分散的各類視頻資源進行統一匯聚、整合、集中管理&#xff0c;在視頻監控播放上&#xff0c;TSINGSEE青犀視頻安防監控匯聚平臺可支持1、4、9、16個畫面窗口播放&#xff0c;可同時播放多…

Linux的ln命令

ln是link的縮寫,在Linux中 ln 命令的功能是為某一個文件在另外一個位置建立一個同步的鏈接&#xff0c;當我們需要在不同的目錄&#xff0c;用到相同的文件時&#xff0c;我們不需要在每一個需要的目錄下都放一個必須相同的文件&#xff0c;我們只要在某個固定的目錄&#xff0…

Ubuntu18.04.4裸機配置

下載虛擬機Ubuntu18.04.4 鏈接&#xff1a;https://pan.baidu.com/s/1jyucyUSXa9-Fw9ctuU87hA 提取碼&#xff1a;o42a –來自百度網盤超級會員V5的分享 VMware選擇鏡像安裝 設置你的用戶名&#xff0c;就像windows上登錄用戶一樣簡單 下一步……下一步……如此簡單 下載…

Floyd(多源匯最短路)

Floyd求最短路 給定一個 n 個點 m 條邊的有向圖&#xff0c;圖中可能存在重邊和自環&#xff0c;邊權可能為負數。 再給定 k 個詢問&#xff0c;每個詢問包含兩個整數 x 和 y&#xff0c;表示查詢從點 x 到點 y 的最短距離&#xff0c;如果路徑不存在&#xff0c;則輸出 impo…

每日一題 33搜素旋轉排序數組(二分)

題目 整數數組 nums 按升序排列&#xff0c;數組中的值 互不相同 。 在傳遞給函數之前&#xff0c;nums 在預先未知的某個下標 k&#xff08;0 < k < nums.length&#xff09;上進行了 旋轉&#xff0c;使數組變為 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[…

Fortinet數據中心防火墻及服務ROI超300%!Forrester TEI研究發布

近日&#xff0c;專注網絡與安全融合的全球網絡安全領導者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;聯合全球知名分析機構Forrester發布總體經濟影響獨立分析報告&#xff0c;詳細闡述了在企業數據中心部署 FortiGate 下一代防火墻&#xff08;NGFW&#xff09…

Django圖書商城系統實戰開發-實現商品管理

Django圖書商城系統實戰開發 - 實現商品管理 在本教程中&#xff0c;我們將使用Django框架來實現一個簡單的圖書商城系統&#xff0c;并重點討論如何實現商品管理功能。此外&#xff0c;我們還將介紹如何使用Markdown格式來寫博客&#xff0c;并將其集成到我們的圖書商城系統中…

緩存淘汰算法(LFU LRU FIFO)及進程的狀態和轉換

目錄 一、緩存淘汰算法 1.LFU&#xff08;Least Frequently Used&#xff09;最近最不常用算法 2.LRU&#xff08;Least Recently User&#xff09;最近最少使用算法 3.FIFO&#xff08;First in first out&#xff09;先進先出算法 二、進程的狀態和轉換 1.最基本的三種狀…

OpenCV圖像處理——模版匹配和霍夫變換

目錄 模版匹配原理實現 霍夫變換霍夫線檢測 模版匹配 原理 實現 rescv.matchTemplate(img,template,method)import numpy as np import cv2 as cv import matplotlib.pyplot as pltimgcv.imread(./汪學長的隨堂資料/6/模板匹配/lena.jpg) templatecv.imread(./汪學長的隨堂資…

UniApp 使用命令創建頁面的詳細指南

系列文章目錄 文章目錄 系列文章目錄前言一、安裝Uni-CLI二、創建頁面三、頁面創建命令四、頁面結構五、頁面使用總結 前言 UniApp是一款跨平臺的前端框架&#xff0c;可以用于開發同時運行在多個平臺&#xff08;如微信小程序、H5、App等&#xff09;的應用程序。本文將詳細介…

系統架構設計師---考試通關練習題

第一章 系統架構設計師概述 1 .以下()不是現代信息系統的架構的三個要素。 A.構件 B.模式 C.規劃 D.屬性 解析:現代信息系統的架構有三個要素,即構件、模式和規劃。 答案:D 2. 軟件系統架構是關于軟件系統的結構、行為和()的高級抽象。 A.構件 B.模式 C…

centos-stream-9 centos9 配置國內yum源 阿里云源

源配置 tips: yum配置文件路徑 /etc/yum.repos.d/centos.repo 1.備份源配置 [Very Important!]mv /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.backup2.Clean Cache: yum clean all3.Backup the Old CentOS-Base.repo If exist this file.cd /etc/yum.repos.…

使用chatGPT-4 暢聊量子物理學(三)

集合了人類智慧的照片&#xff0c;來自 1927 年舉行的第五屆索爾維國際會議。 Omer 什么是“物理系統在被測量之前不具有確定的屬性。量子力學只能預測給定測量的可能結果的概率分布" ChatGPT 這句話描述了量子力學中的一種基本原則&#xff0c;即“物理系統在被測量之前…

手寫線程池的過程與思考

線程池的抽象接口 public interface SelfThreadPool {// 提交任務到線程池void execute(Runnable runnable);//關閉void shutdown();//獲取線程池初始化的大小int getInitSize();//獲取線程池最大的大小int getMaxSize();// 獲取線程池核心線程數量,int getCoreSize();// 獲取…

世微AP2813 平均電流雙路降壓恒流驅動器 LED儲能電源驅動指示燈IC 可恒流可爆閃 可雙路恒流

產品描述 AP2813 是一款雙路降壓恒流驅動器,高效率、外圍簡單、內置功率管&#xff0c;適用于 5-80V 輸入的高精度降壓 LED 恒流驅動芯片。內置功率管輸出最大功率可達12W&#xff0c;最大電流 1.2A。AP2813 一路直亮&#xff0c;另外一路通過 MODE1 切換全亮&#xff0c;爆閃…

利用OpenCV光流算法實現視頻特征點跟蹤

光流簡介 光流&#xff08;optical flow&#xff09;是運動物體在觀察成像平面上的像素運動的瞬時速度。光流法是利用圖像序列中像素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關系&#xff0c;從而計算出相鄰幀之間物體的運動信息的一種方法。…

大模型PEFT技術原理(二):P-Tuning、P-Tuning v2

隨著預訓練模型的參數越來越大&#xff0c;尤其是175B參數大小的GPT3發布以來&#xff0c;讓很多中小公司和個人研究員對于大模型的全量微調望而卻步&#xff0c;近年來研究者們提出了各種各樣的參數高效遷移學習方法&#xff08;Parameter-efficient Transfer Learning&#x…