排序——交換排序

在上篇文章我們詳細介紹了排序的概念與插入排序,大家可以通過下面這個鏈接去看:

排序的概念及插入排序

這篇文章就介紹一下一種排序方式:交換排序。

一,交換排序

基本思想:兩兩比較,如果發生逆序則交換,直到所有記錄都排好序為止。

而交換排序又分為兩種:

????????冒泡排序O(n2)

快速排序O( nlog2n )

1,冒泡排序

A 基本內容

學習過C語言的朋友應該對這個比較熟悉,其基本思想就是:??

每趟不斷將記錄兩兩比較,并按“前小后大” 規則交換

如圖進行一次冒泡排序的過程:

21254925*16,? 08

212525*1608 49

21251608 25*49

211608 2525*49

1608 212525*49

0816212525*49

?冒泡排序的優點:

每趟結束時,不僅能擠出一個最大值到最后面位置,還能同時部分理順其他元素;?

??? 一旦下趟沒有交換,還可提前結束排序

在c語言的代碼中實際就是通過兩個for循環來實現?

void main() 			 
{	int a[11];		/*a[0]不用,之用a[1]~a[10]*/int i,j,t;printf("\nInput 10 numbers: \n");for(i=1;i<=10;i++)	scanf("%d",&a[i]);	printf("\n");for(j=1;j<=9;j++)for(i=1;i<=10-j;i++)if(a[i]>a[i+1])	{t=a[i];a[i]=a[i+1];a[i+1]=t;}//交換for(i=1;i<=10;i++)	printf("%d ",a[i]);   
}

下面是一個例子?

下面這段代碼與上面的區別是,當遇見數組部分有序時,可以提前結束循環,節省不必要的時間。

  1. 定義了一個名為bubble_sort的函數,接受一個順序表L作為參數。
  2. 初始化變量m為順序表的長度減1,flag為1,表示是否需要繼續排序。
  3. 使用while循環進行排序,條件是m > 0flag == 1。當m等于0時,說明已經遍歷完所有元素;當flag為0時,說明在一次循環中沒有發生任何交換,說明已經排序完成。
  4. while循環內部,使用for循環遍歷順序表中的元素,從第一個元素到第m個元素。
  5. for循環內部,比較當前元素L.r[j].key和下一個元素L.r[j+1].key的大小。如果當前元素的鍵值大于下一個元素的鍵值,則交換這兩個元素的位置,并將flag設置為1,表示發生了交換。
  6. 每次循環結束后,將m減1,縮小未排序部分的范圍。
  7. while循環結束時,順序表L中的元素已經按照升序排列。
void bubble_sort(SqList &L){ int m,i,j,flag=1;   RedType x;m=n-1;while((m>0)&&(flag==1)){  flag=0;for(j=1;j<=m;j++)if(L.r[j].key>L.r[j+1].key){  flag=1;x=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=x; //交換}//endifm--;}//endwhile}

B 冒泡排序的算法分析:

? 設對象個數為 n?
? 比較次數 移動次數 與初始排列有關

最好情況下:?只需 1趟排序,比較次數為 n-1,不移動 ?

while((m>0)&&(flag==1)){  flag=0;for(j=1;j<=m;j++)if(L.r[j].key>L.r[j+1].key){  flag=1;  x=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=x; } ……     

最壞情況下:?n-1趟排序,第i趟比較n-i次,移動3(n-i)?

冒泡排序

時間復雜度為 o(n2)?

空間復雜度為 o(1)

是一種穩定的排序方法

2,快速排序

A 基本內容

基本思想:

? 任取一個元素 ( 如第一個 ) 為中心
? 所有比它 的元素一律前放,比它 的元素一律后放,形成 左右兩個子表
? 對各子表重新選擇 中心 元素并依此規則調整,直到每個子表的元素 只剩一個

?在數組中,我們通過兩個指針來實現排序過程

?后面也是一樣的操作,我們會發現每趟子表的形成從兩頭向中間交替式逼近,對各子表操作相似,因此我們可采用遞歸算法來實現對數據的排序過程。

// 快速排序算法
void main()
{QSort(L, 1, L.length); // 對數組L進行快速排序
}// 快速排序函數,參數為待排序的數組L,起始下標low和結束下標high
void QSort(SqList &L, int low, int high)
{if (low < high){pivotloc = Partition(L, low, high); // 獲取基準元素的位置QSort(L, low, pivotloc - 1);       // 對基準元素左邊的子數組進行快速排序QSort(L, pivotloc + 1, high);      // 對基準元素右邊的子數組進行快速排序}
}// 劃分函數,參數為待排序的數組L,起始下標low和結束下標high
int Partition(SqList &L, int low, int high)
{L.r[0] = L.r[low]; // 將第一個元素作為基準元素pivotkey = L.r[low].key;while (low < high){// 從右向左找到第一個小于基準元素的下標while (low < high && L.r[high].key >= pivotkey)--high;L.r[low] = L.r[high]; // 將找到的元素放到左邊// 從左向右找到第一個大于基準元素的下標while (low < high && L.r[low].key <= pivotkey)++low;L.r[high] = L.r[low]; // 將找到的元素放到右邊}L.r[low] = L.r[0]; // 將基準元素放到正確的位置return low;        // 返回基準元素的下標
}

?B 快速排序的算法分析:

?最好情況:劃分后,左右子序列長度相同

最壞情況:遞歸樹成為單支樹?

到此交換排序就結束了, 如果文章對你有用的話請點個贊支持一下吧!

下篇文章將更新選擇排序的內容。

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

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

相關文章

jenkins系列-09.jpom構建java docker harbor

本地先啟動jpom server agent: /Users/jelex/Documents/work/jpom-2.10.40/server-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % sh Server.sh start/Users/jelex/Documents/work/jpom-2.10.40/agent-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % ./Agent.…

達夢數據庫的系統視圖v$sessions

達夢數據庫的系統視圖v$sessions 達夢數據庫&#xff08;DM Database&#xff09;是中國的一款國產數據庫管理系統&#xff0c;它提供了類似于Oracle的系統視圖來監控和管理數據庫。V$SESSIONS 是達夢數據庫中的一個系統視圖&#xff0c;用于顯示當前數據庫會話的信息。 以下…

全自主巡航無人機項目思路:STM32/PX4 + ROS + AI 實現從傳感融合到智能規劃的端到端解決方案

1. 項目概述 本項目旨在設計并實現一款高度自主的自動巡航無人機系統。該系統能夠按照預設路徑自主飛行&#xff0c;完成各種巡航任務&#xff0c;如電力巡線、森林防火、邊境巡邏和災害監測等。 1.1 系統特點 基于STM32F4和PX4的高性能嵌入式飛控系統多傳感器融合技術實現精…

MYSQL--第八次作業

MYSQL–第八次作業 一、備份與恢復 環境搭建&#xff1a; CREATE DATABASE booksDB; use booksDB;CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL );CREATE TABLE authors ( auth_id INT NOT NULL PRI…

geoServer在windows中下載安裝部署詳細操作教程

這里寫目錄標題 1.安裝環境檢查2.下載安裝包&#xff08;1&#xff09;進入下載地址&#xff1a;&#xff08;2&#xff09;以下載最新版為例&#xff0c;點擊“Stable GeoServer”下載&#xff08;3&#xff09;安裝有兩種方式&#xff08;4&#xff09;我這里選擇下載war包 3…

python作業三

1.使用requests模塊獲取這個json文件http://java-api.super-yx.com/html/hello.json 2.將獲取到的json轉為dict 3.將dict保存為hello.json文件 4.用io流寫一個copy(src,dst)函數,復制hello.json到C:\hello.json import json import shutilimport requests #使用requests模塊獲…

Qt MV架構-視圖類

一、基本概念 在MV架構中&#xff0c;視圖包含了模型中的數據項&#xff0c;并將它們呈現給用戶。數據項的表示方法&#xff0c;可能和數據項在存儲時用的數據結構完全不同。 這種內容與表現分離之所以能夠實現&#xff0c;是因為使用了 QAbstractItemModel提供的一個標準模…

`nmap`模塊是一個用于與Nmap安全掃描器交互的庫

在Python中&#xff0c;nmap模塊是一個用于與Nmap安全掃描器交互的庫。Nmap&#xff08;Network Mapper&#xff09;是一個開源工具&#xff0c;用于發現網絡上的設備和服務。雖然Python的nmap模塊可能不是官方的Nmap庫&#xff08;因為Nmap本身是用C/C編寫的&#xff09;&…

基于JavaSpringBoot+Vue+uniapp微信小程序校園宿舍管理系統設計與實現

基于JavaSpringBootVueuniapp微信小程序實現校園宿舍管理系統設計與實現 目錄 第一章 緒論 1.1 研究背景 1.2 研究現狀 1.3 研究內容 第二章 相關技術介紹 2.1 Java語言 2.2 HTML網頁技術 2.3 MySQL數據庫 2.4 Springboot 框架介紹 2.5 VueJS介紹 2.6 ElementUI介紹…

視頻轉換、提取音頻、視頻加水印、視頻去水印、音頻轉換、分割合并壓縮等,批量還幾乎免費

「想轉就轉視頻音頻助手」免費版來襲&#xff01; 在數字化時代&#xff0c;視頻和音頻處理已成為我們日常生活的一部分。無論是制作個人視頻博客、編輯家庭影片&#xff0c;還是處理音頻文件&#xff0c;我們都在尋找一個強大而易于使用的解決方案。今天&#xff0c;我要向您…

基于大語言模型(LLM)的合成數據生成、策展和評估的綜述

節前&#xff0c;我們星球組織了一場算法崗技術&面試討論會&#xff0c;邀請了一些互聯網大廠朋友、參加社招和校招面試的同學。 針對算法崗技術趨勢、大模型落地項目經驗分享、新手如何入門算法崗、該如何準備、面試常考點分享等熱門話題進行了深入的討論。 合集&#x…

【JVM實戰篇】內存調優:內存泄露危害+內存監控工具介紹+內存泄露原因介紹

文章目錄 內存調優內存溢出和內存泄漏內存泄露帶來什么問題內存泄露案例演示內存泄漏的常見場景場景一場景二 解決內存溢出的方法常用內存監控工具Top命令優缺點 VisualVM軟件、插件優缺點監控本地Java進程監控服務器的Java進程&#xff08;生產環境不推薦使用&#xff09; Art…

【圖解大數據技術】流式計算:Spark Streaming、Flink

【圖解大數據技術】流式計算&#xff1a;Spark Streaming、Flink 批處理 VS 流式計算Spark StreamingFlinkFlink簡介Flink入門案例Streaming Dataflow Flink架構Flink任務調度與執行task slot 和 task EventTime、Windows、WatermarksEventTimeWindowsWatermarks 批處理 VS 流式…

如何查找電腦的MAC地址

一. 什么是mac地址&#xff1f; mac地址本質上幫助我們連接到我們遇到的大多數本地網絡。每個網絡適配器通常由網絡接口??控制器(NIC) 制造商分配一個唯一的 mac 地址。 二. 如何查找mac地址 1.點擊網絡和Internet設置 2.點擊WLAN點擊硬件屬性 3.即可查看mac地址

智慧城市3d數據可視化系統提升信息匯報的時效和精準度

在信息大爆炸的時代&#xff0c;數據的力量無可估量。而如何將這些數據以直觀、高效的方式呈現出來&#xff0c;成為了一個亟待解決的問題。為此&#xff0c;我們推出了全新的3D可視化數據大屏系統&#xff0c;讓數據“躍然屏上”&#xff0c;助力您洞察先機&#xff0c;決勝千…

從零開始實現大語言模型(五):縮放點積注意力機制

1. 前言 縮放點積注意力機制(scaled dot-product attention)是OpenAI的GPT系列大語言模型所使用的多頭注意力機制(multi-head attention)的核心,其目標與前文所述簡單自注意力機制完全相同,即輸入向量序列 x 1 , x 2 , ? ? , x n x_1, x_2, \cdots, x_n x

pytorch訓練的時候 shm共享內存不足,導致訓練停止

1.查看shm情況 df -h /dev/shm內存已經滿了&#xff0c;因為之前訓練多次訓練意外停止到shm中的緩存不能及時被清理 2、手動清理shm 依然沒被釋放 3、查看關聯的進程&#xff0c;一個一個kill lsof |grep deletedkill -9 46619 44618 44617 。。。。。4、搞定

Spring @Scheduled學習

一. Jdk中的定時任務 我們平時在 Spring 項目中會使用 Scheduled 開啟定時任務&#xff1b; jdk 中其實也提供了定時任務線程池 ScheduledThreadPool&#xff0c;我們可以直接通過 Executors 工具類獲取&#xff1b; // 創建了核心線程數為 2 的 ScheduledThreadPool 對象 S…

ROS2 + 科大訊飛 初步實現機器人語音控制

環境配置&#xff1a; 電腦端&#xff1a; ubuntu22.04實體機作為上位機 ROS版本&#xff1a;ros2-humble 實體機器人&#xff1a; STM32 思嵐A1激光雷達 科大訊飛語音SDK 訊飛開放平臺-以語音交互為核心的人工智能開放平臺 實現步驟&#xff1a; 1. 下載和處理科大訊飛語音模…

開發指南048-前端模塊版本

平臺前端框架內置了一個文件version.vue <template> <div> <br> 應用名稱: {{name}} <br> 當前版本&#xff1a;{{version}} <br> 服務網關: {{gateway}} </div> </template> <scrip…