數據結構:交換排序

冒泡排序

起泡排序,別名“冒泡排序”,該算法的核心思想是將無序表中的所有記錄,通過兩兩比較關鍵字,得出升序序列或者降序序列。

算法步驟

  1. 比較相鄰的元素。如果第一個元素大于第二個元素,就交換它們。
  2. 對每一對相鄰的元素作相同的操作,從開始第一對到末尾的最后一對。
  3. 針對所有的元素重復以上操作,每次出來最后一個

算法理解

例如,對無序表{49,38,65,97,76,13,27,49}進行升序排序的具體實現過程如圖 1 所示:

在這里插入圖片描述

圖 1 第一次起泡

如圖 1 所示是對無序表的第一次起泡排序,最終將無序表中的最大值 97 找到并存儲在表的最后一個位置。具體實現過程為:

  1. 首先 49 和 38 比較,由于 38<49,所以兩者交換位置,即從(1)到(2)的轉變;
  2. 然后繼續下標為 1 的同下標為 2 的進行比較,由于 49<65,所以不移動位置,(3)中 65 同 97 比較得知,兩者也不需要移動位置;
  3. 直至(4),97 同 76 進行比較,76<97,兩者交換位置,如(5)所示;
  4. 同樣 97>13(5)、97>27(6)、97>49(7),所以經過一次冒泡排序,最終在無序表中找到一個最大值 97,第一次冒泡結束;

由于 97 已經判斷為最大值,所以第二次冒泡排序時就需要找出除 97 之外的無序表中的最大值,比較過程和第一次完全相同。

在這里插入圖片描述

經過第二次冒泡,最終找到了除 97 之外的又一個最大值 76,比較過程完全一樣,這里不再描述。

通過一趟趟的比較,一個個的“最大值”被找到并移動到相應位置,直到檢測到表中數據已經有序,或者比較次數等同于表中含有記錄的個數,排序結束,這就是起泡排序。

代碼實現

#include "iostream"
using namespace std;void swap(int *a, int *b){//交換a和b的位置int temp;temp = *a;*a = *b;*b = temp;
}
int main()
{int array[8] = {49,38,65,97,76,13,27,49};//有多少記錄,就需要多少次冒泡,當比較過程,所有記錄都按照升序排列時,排序結束for (int i = 0; i < 8; i++){int key=0;//每次開始冒泡前,初始化 key 值為 0//每次起泡從下標為 0 開始,到 8-i 結束for (int j = 0; j+1<8-i; j++){if (array[j] > array[j+1]){key=1;swap(&array[j], &array[j+1]);}}//如果 key 值為 0,表明表中記錄排序完成if (key==0) {break;}}for (i = 0; i < 8; i++){cout << array[i] << " ";}return 0;
}

運行結果:

13 27 38 49 49 65 76 97

總結

使用起泡排序算法,其時間復雜度同實際表中數據的無序程度有關。若表中記錄本身為正序存放,則整個排序過程只需進行 n-1(n 為表中記錄的個數)次比較,且不需要移動記錄;若表中記錄為逆序存放(最壞的情況),則需要 n-1趟排序,進行 n(n-1)/2 次比較和數據的移動。所以該算法的時間復雜度為O(n2)。

快速排序

快速排序本質上是可以說是冒泡排序基礎上的遞歸分治法,它也是分治算法在排序算法上的一種經典應用。

算法思想

快速排序是通過多次比較和交換來實現有序的。在一次排序中把將要排序的元素分成兩個獨立的子數組,其中一個子數組的所有元素全大于另一個組數組的所有元素,然后繼續遞歸排序這兩部分。

算法思想步驟:

  1. 從序列中挑出一個元素,稱之為邊界或者基準
  2. 重新排序數列,所有元素比基準值小的放在基準前面,所有元素比基準值大的放在基準后面(相同的數可以放在任意一邊)。這個操作結束后,該基準就處于序列的中間位置,這個操作稱之為分區操作
  3. 遞歸吧小于基準元素的組數組和大于基準元素的子數組排序

算法理解

在這里插入圖片描述

代碼實現

#include "iostream"
using namespace std;#define MAX 9
//單個記錄的結構體
typedef struct {int key;
}SqNote;
//記錄表的結構體
typedef struct {SqNote r[MAX];int length;
}SqList;
//此方法中,存儲記錄的數組中,下標為 0 的位置時空著的,不放任何記錄,記錄從下標為 1 處開始依次存放
int Partition(SqList *L,int low,int high){L->r[0]=L->r[low];int pivotkey=L->r[low].key;//直到兩指針相遇,程序結束while (low<high) {//high指針左移,直至遇到比pivotkey值小的記錄,指針停止移動while (low<high && L->r[high].key>=pivotkey) {high--;}//直接將high指向的小于支點的記錄移動到low指針的位置。L->r[low]=L->r[high];//low 指針右移,直至遇到比pivotkey值大的記錄,指針停止移動while (low<high && L->r[low].key<=pivotkey) {low++;}//直接將low指向的大于支點的記錄移動到high指針的位置L->r[high]=L->r[low];}//將支點添加到準確的位置L->r[low]=L->r[0];return low;
}
void QSort(SqList *L,int low,int high){if (low<high) {//找到支點的位置int pivotloc=Partition(L, low, high);//對支點左側的子表進行排序QSort(L, low, pivotloc-1);//對支點右側的子表進行排序QSort(L, pivotloc+1, high);}
}
void QuickSort(SqList *L){QSort(L, 1,L->length);
}
int main() {SqList *L = new SqList;L->length=8;L->r[1].key=49;L->r[2].key=38;L->r[3].key=65;L->r[4].key=97;L->r[5].key=76;L->r[6].key=13;L->r[7].key=27;L->r[8].key=49;QuickSort(L);for (int i=1; i<=L->length; i++) {cout << L->r[i].key << " ";}return 0;
}

運行結果:

13 27 38 49 49 65 76 97

總結

快速排序算法的時間復雜度為O(nlogn),是所有時間復雜度相同的排序方法中性能最好的排序算法。

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

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

相關文章

Python-OpenCV中的圖像處理-圖像金字塔

Python-OpenCV中的圖像處理-圖像金字塔 圖像金字塔高斯金字塔拉普拉斯金字塔 金字塔圖像融合 圖像金字塔 同一圖像的不同分辨率的子圖集合&#xff0c;如果把最大的圖像放在底部&#xff0c;最小的放在頂部&#xff0c;看起來像一座金字塔&#xff0c;故而得名圖像金字塔。cv2…

小程序發布注意事項

1、使用HBuildx的 發布 功能發布小程序&#xff0c;因為編譯完的代碼目錄不是同一個 如果使用 運行 到小程序&#xff0c;最后發布的版本會顯示”無法連接本地服務器“ 2、使用unicloud的云服務 uniCloud發行 | uni-app官網 阿里云的unicloud的話&#xff0c;使用request域名…

Spring中Bean的循環依賴問題

1.什么是Bean的循環依賴&#xff1f; 簡單來說就是在A類中&#xff0c;初始化A時需要用到B對象&#xff0c;而在B類中&#xff0c;初始化B時需要用到A對象&#xff0c;這種狀況下在Spring中&#xff0c;如果A和B同時初始化&#xff0c;A&#xff0c;B同時都需要對方的資源&…

電腦開機出現Boot Device怎么辦?

開機出現Boot Device這個問題很常見&#xff0c;有時還會出現No Boot Device的問題&#xff0c;雖然多了一個單詞&#xff0c;但意思是相同的&#xff0c;這些問題說明你的系統盤出現了問題&#xff0c;或者是引導出現了問題。這該如何解決呢&#xff1f; 方法1. 檢查主板或硬盤…

【算法——雙指針】LeetCode 283 移動零

題目描述&#xff1a; 思路&#xff1a; (雙指針) O(n)O(n)O(n) 給定一個數組 nums&#xff0c;要求我們將所有的 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 如圖所示&#xff0c;數組nums [0,1,0,3,12]&#xff0c;移動完成后變成nums [1,3,12,0,0] &am…

若依vue -【 100 ~ 更 ~ 110 】

100 主子表代碼生成詳解 1 新建數據庫表結構&#xff08;主子表&#xff09; -- ---------------------------- -- 客戶表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

Docker部署rabbitmq遇到的問題 Stats in management UI are disabled on this node

1. Stats in management UI are disabled on this node #進入rabbitmq容器 docker exec -it {rabbitmq容器名稱或者id} /bin/bash#進入容器后&#xff0c;cd到以下路徑 cd /etc/rabbitmq/conf.d/#修改 management_agent.disable_metrics_collector false echo management_age…

談談語音助手

目錄 1.什么是語音助手 2.語音助手的發展過程 3.現在有哪些成熟的語音助手 4.語音助手對人類發展的影響 1.什么是語音助手 語音助手是一種能夠通過語音交互與用戶進行溝通和執行任務的虛擬助手。它基于人工智能和自然語言處理技術&#xff0c;能夠理解用戶的語音指令&#x…

數據結構-隊列的實現(C語言版)

前言 隊列是一種特殊的線性表&#xff0c;它只允許在一端對數據進行插入操作&#xff0c;在另一端對數據進行刪除操作的特殊線性表&#xff0c;隊列具有先進先出的&#xff08;FIFO&#xff09;的 特性&#xff0c;進行插入操作的一端稱為隊尾&#xff0c;進行刪除操作的一端稱…

JZ37序列化二叉樹

題目地址&#xff1a;序列化二叉樹_牛客題霸_牛客網 題目回顧&#xff1a; 解題思路&#xff1a; 首先&#xff0c;序列化就是將二叉樹的節點值放入一個字符串中&#xff0c;這里可以按照前序遍歷的思路來進行操作&#xff0c;謙虛遍歷是&#xff1a;根左右的情況&#xff0c;…

什么是React?React與VU的優缺點有哪些?

什么是React&#xff1f;什么是VUE&#xff1f; 維基百科上的概念解釋&#xff0c;Vue.js是一個用于創建用戶界面的開源MVVM前端JavaScript框架&#xff0c;也是一個創建單頁應用的Web應用框架。Vue.js由尤雨溪&#xff08;Evan You&#xff09;創建&#xff0c;由他和其他活躍…

Cmd部署HexoGithub443問題

git config --global http.proxy “localhost:7890” 配置下代理即可 本文由 mdnice 多平臺發布

微信小程序 地圖map(電子圍欄圓形和多邊形)

正常情況下是沒有手機上畫電子圍欄的&#xff0c;公共平臺上我也沒找到&#xff0c;所以走了一個歪點子&#xff0c;就是給地圖添加點擊事件&#xff0c;記錄點的位置&#xff0c;在畫到電子圍欄上就是添加電子圍欄了&#xff0c;如果只是顯示電子圍欄就簡單了 一、多邊形電子…

2023.8.12號論文閱讀

文章目錄 TriFormer: A Multi-modal Transformer Framework For Mild Cognitive Impairment Conversion Prediction摘要本文方法實驗結果 SwIPE: Efficient and Robust Medical Image Segmentation with Implicit Patch Embeddings摘要本文方法實驗結果 TriFormer: A Multi-mod…

macos搭建python3虛擬環境

我們知道macos自帶的python版本是Python2.7, 這個版本比較老而且往往和我們的工程不兼容&#xff0c;所以就得需要我們升級Python版本&#xff0c; 我們不建議直接升級macos自帶的本地Python2.7, 因為macos有一些基礎軟件是依賴于Python2.7的&#xff0c;如果動了遇到問題想再…

日志框架及其使用方法

log4j和logBack,同一個人寫的&#xff0c;logBack為log4j的升級版&#xff0c;SpringBoot中默認集成logBack 作用&#xff1a;記錄軟件發布后的一些bug,以及數據是怎樣被操作的 傳統開發弊端&#xff1a; 1.日志直接輸出在控制臺&#xff0c;關閉控制臺后&#xff0c;日志消…

Netty:在一個ByteBuf中尋找另外一個ByteBuf出現的位置

說明 利用ByteBufUtil的indexOf(ByteBuf needle, ByteBuf haystack)函數可以在haystack中尋找needle出現的位置。如果沒有找到&#xff0c;返回-1。 示例 在一個ByteBuf 中找到了另外一個ByteBuf package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.…

Linux: network: tools: tcpdump,抓取vlan包需要注意的事情;不然會出現LLC協議

https://bugzilla.redhat.com/show_bug.cgi?id498981#c4 https://serverfault.com/questions/544651/vlan-tags-not-shown-in-packet-capture-linux-via-tcpdump 如果不加-e參數&#xff0c;抓取不到 vlan信息&#xff0c;會導致wireshark解析出現問題。因為&#xff0c;抓到…

AirServer是什么軟件,手機屏幕投屏電腦神器

什么是 AirServer&#xff1f; AirServer 是適用于 Mac 和 PC 的先進的屏幕鏡像接收器。 它允許您接收 AirPlay 和 Google Cast 流&#xff0c;類似于 Apple TV 或 Chromecast 設備。AirServer 可以將一個簡單的大屏幕或投影儀變成一個通用的屏幕鏡像接收器 &#xff0c;是一款…

PDF Expert 3.3 for mac

PDF Expert是一款專業的PDF編輯和閱讀工具。它可以幫助用戶在Mac、iPad和iPhone等設備上查看、注釋、編輯、填寫和簽署PDF文檔。 以下是PDF Expert的特點&#xff1a; PDF編輯&#xff1a;PDF Expert提供了豐富的PDF編輯功能&#xff0c;包括添加、刪除、移動、旋轉、縮放、裁…