死磕算法之快速排序

版權聲明:本文為博主原創文章,未經博主允許不得轉載。博客源地址為zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80851021


學習更多算法系列請參考文章:死磕算法之匯總篇


快速排序是一個運用了分治法和遞歸算法的排序方式。

假如我們現在要排序的數組為[3,1,0,2,8,4,2]。那么在進行快速排序的時候我們先要進行一些準備:

  • n作為一個數組中的標桿,一趟排序過后我們要把數組中所有大于n的數放在它的右邊,所有小于n的放在它的左邊。一般情況下我們會取數組第一個元素作為n,在此數組中就是n=3
  • i我們使用i來找數組中大于標桿的值,i初始指向數組第一個位置
  • j我們使用j來找數組中小于標桿的值,j初始指向數組最后一個位置

下面開始排序:

  1. 先從數組右邊開始,我們發現j指向的元素2比標桿n小,那么我們將j指向的元素賦值給i指向的元素,停止操作。此時數組為[2,1,0,2,8,4,2],i指向第一個位置,j仍指向最后一個。
  2. 從數組左邊開始,i指向的元素2比標桿小,所以不做操作,使i++,i指向的元素1比標桿小,所以不做操作,使i++,一直到i指向8的時候比標桿大(注意此處如果等于的話也要操作),那么就把i指向的元素賦值給j指向的元素,此時數組為[2,1,0,2,8,4,8],i指向第五個位置。也就是元素8,j仍然指向最后一個位置。
  3. 繼續從右邊操作,j指向的8不比n小,所以不做操作,j--,4不比3小,不做操作,j--。現在i和j的位置重合了,把n放到這個位置上。我們此輪的操作也就結束了,接下來我們把3所在的位置左邊分為一個數組,右邊位置分為一個數組再次進行剛才的操作。(此處就是一個遞歸調用了)

接下來就來看一個圖片描述的過程





接下來上代碼

public static void quickSort(int[] a, int l, int r) {if (l < r) {int i,j,n;
        i = l;j = r;n = a[i];while (i < j) {while(i < j ){if(a[j] < n){a[i] = a[j];
                    break;
                }j--;
            }while(i < j ){if(a[i] >= n){a[j] = a[i];break;
                }i++;}}a[i] = n;quickSort(a, l, i-1); /* 遞歸調用 */quickSort(a, i+1, r); /* 遞歸調用 */}
}

快速排序講完了。在這里溫馨提示大家,學習算法時,我們沒必要拘泥于代碼的實現,那沒有意義。我的建議就是深入理解步驟,當你理解步驟以后代碼是隨你怎么玩都可以的。


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

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

相關文章

九點標定進行仿射變換halcon仿真代碼

篩選出來的點得坐標已經顯示在PxRow、PxColunm里邊 * Image Acquisition 01: Code generated by Image Acquisition 01 read_image (Image, C:/Users/Administrator/Desktop/標定板圖片.png) dev_close_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHand…

用SQL語句添加刪除修改字段_常用SQL

1.增加字段 alter table docdsp add dspcodechar(200)2.刪除字段 ALTER TABLE table_NAME DROP COLUMNcolumn_NAME3.修改字段類型 ALTER TABLE table_name ALTER COLUMNcolumn_name new_data_type4.sp_rename 改名 EXEC sp_rename [dbo].[Table_1].[fi…

DAVINCI開發原理之三----達芬奇編解碼引擎Codec Engine(CE)

DaVinci是DSP和ARM 雙核架構的SOC芯片。對芯片與外界的交互通過ARM端的Montavista Linux和相關驅動與應用程序來管理&#xff0c; DSP端只處理編解碼相關的算法。DSP和ARM之間的通訊和交互是通過引擎(Engine)和服務器(Server)來完成的。1. 編解碼引擎(Codec Engine) a. 核心引…

Windows操作系統安全加固

本文檔旨在指導系統管理人員或安全檢查人員進行Windows操作系統的安全合規性檢查和配置。 1. 賬戶管理和認證授權 1.1 賬戶 默認賬戶安全 禁用Guest賬戶。禁用或刪除其他無用賬戶&#xff08;建議先禁用賬戶三個月&#xff0c;待確認沒有問題后刪除。&#xff09;操作步驟 打開…

ios修改了coredata數據結構后,更新安裝會閃退

如果iOS App 使用到CoreData&#xff0c;并且在上一個版本上有數據庫更新&#xff08;新增表、字段等操作&#xff09;&#xff0c;那在覆蓋安裝程序時就要進行CoreData數據庫的遷移&#xff0c;具體操作如下&#xff1a; 1.選中你的mydata.xcdatamodeld文件&#xff0c;選擇菜…

TI DAVINCI開發原理(總共5部分)

2011-06-03 11:14:17| 分類&#xff1a; TI 達芬奇視頻處 | 標簽&#xff1a; |字號大中小訂閱 DAVINCI開發原理之一----ARM端開發環境的建立(DVEVM) 1. 對DAVINCI平臺&#xff0c;TI在硬件上給予雙核架構強有力的支撐&#xff0c;在DSP端用DSP/BIOS來支持音視頻算法的運行…

數據庫代碼寫法

1.創建數據庫create database test2; 2.刪除數據庫drop database test2; 3.創建表 create table ceshi (ids int auto_increment primary key,uid varchar(20),name varchar(20),class varchar(20),foreign key (class) references class(code) ); create table class (code …

random庫的使用

有關Python中random標準庫的使用 Python中關于隨機值的部分&#xff0c;借助的是根據當前的隨機種子&#xff0c;通過梅森旋轉算法&#xff0c;生成一段隨機序列。 基本隨機函數 random.seed(aNone)初始化給定的隨機種子&#xff0c;默認值為當前的系統時間。 random.random()生…

ThinkPHP--欄目增刪改查ADSF

<?php /*** 欄目發布*/ //V層&#xff0c;action/name值 action " :U( Admin/Cat/Cateadd )";/*** 添加欄目數據* C層&#xff0c;寫相應的方法進行數據添加*/ public function add(){if(!IS_POST){$this->display();}else{//var_dump($_POST);$catModelD…

模擬查找晶元的位置

通過模板匹配找到所有模板位置&#xff0c;并且當單擊某個模板時&#xff0c;選中某個模板 read_image (Image, C:/Users/22967/Desktop/晶圓找位置/0.bmp) dev_close_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image)* draw_cir…

JavaScript常用函數之Eval()使用

eval() 功能&#xff1a;首先解釋Javascript代碼 然后執行它 用法&#xff1a;Eval&#xff08;codeString&#xff09; codeString是包含有javascript語句的字符串&#xff0c;在eval之后使用Javascript引擎編譯。即&#xff1a;eval函數可以把一個字符串當作一個javascript表…

初探數位dp

前言&#xff1a;這是蒟蒻第一次寫算法系列&#xff0c;請諸位大佬原諒文筆與排版。 一、導入 在刷題的時候&#xff0c;我們有時會見到這樣一類問題&#xff1a;在區間$[l,r]$內&#xff0c;共有多少個整數滿足某種條件。如果$l$和$r$間的差很小&#xff0c;我們可以考慮暴力枚…

Java演示手機發送短信驗證碼功能實現

我們這里采用阿里大于的短信API 第一步&#xff1a;登陸阿里大于&#xff0c;下載阿里大于的SDK a、在阿里大于上創建自己的應用 b、點擊配置管理中的驗證碼&#xff0c;先添加簽名&#xff0c;再配置短信模板 第二步&#xff1a;解壓相關SDK&#xff0c;第一個為jar包&#xf…

使用標定板對相機位姿進行估計

使用標定板幾個特定的點&#xff0c;來對相機相對標定板平面進行位姿估計。 首先進行相機的畸變校正&#xff0c;之后同個各個標定板間的圓點距離進行位姿估計。 gen_caltab (7, 7, 0.002, 0.5, C:/Users/22967/Desktop/新建文件夾/111.descr, C:/Users/22967/Desktop/新建文件…

音、視頻文件格式

* 說明&#xff1a;首先要分清楚 媒體文件和編碼的區別&#xff1a;文件是既包括視頻又包括音頻、甚至還帶有腳本的一個集合&#xff0c;也可以叫容器&#xff1b;文件當中的視頻和音頻的壓縮算法才是具體的編碼。 *AVI音視頻交互存儲&#xff0c;最常見的音頻視頻容器。支持的…

ELK日志分析系統(轉)

原創作品&#xff0c;允許轉載&#xff0c;轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://467754239.blog.51cto.com/4878013/1700828大綱&#xff1a; 一、簡介 二、Logstash 三、Redis 四、Elasticsearch 五、Kinaba 一、簡介 …

Glide使用總結

首先&#xff0c;添加依賴 implementation com.github.bumptech.glide:glide:4.5.0 annotationProcessor com.github.bumptech.glide:compiler:4.5.0之后添加訪問網絡權限 <uses-permission android:name"android.permission.INTERNET" />一、常用的方法 1、加…

流行的音頻編碼標準

speech codec (G.711, G.723, G.726, G.729, iLBC) 各種各樣的編解碼在各種領域得到廣泛的應用&#xff0c;下面就把各種codec的壓縮率進行一下比較&#xff0c;不正確之處望各位同行指正。 Speech codec&#xff1a; 現主要有的speech codec 有: G.711, G.723, G.726 , G…

【angularjs】使用angular搭建項目,pc端實現網頁中的內容不可復制

實現目標&#xff1a;不可復制頁面內容 js:          <script language"javascript"> if (typeof(document.onselectstart) ! "undefined") { // IE下禁止元素被選取 document.onselectstart function (event){if(event.targe…

DIV+CSS如何讓文字垂直居中?

在說到這個問題的時候&#xff0c;也許有人會問CSS中不是有vertical-align屬性來設置垂直居中的嗎&#xff1f;即使是某些瀏覽器不支持我只需做少許的CSS Hack技術就可以啊&#xff01;所以在這里我還要啰嗦兩句&#xff0c;CSS中的確是有vertical-align屬性&#xff0c;但是它…