C++ 排序(1)

以下是一些插入排序的代碼

1.插入排序

1.直接插入排序

// 升序
// 最壞:O(N^2)  逆序
// 最好:O(N)    順序有序
void InsertSort(vector<int>& a, int n)
{for (int i = 1; i < n; i++){int end = i - 1;int tmp = a[i];// 將tmp插入到[0,end]區間中,保持有序while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}
//一個一個插入  一個  一個排序

2.折半插入排序?

折半插入排序本質上就是?插入排序 +二分查找

// 折半插入排序函數
void binaryInsertionSort(std::vector<int>& arr) {int n = arr.size();for (int i = 1; i < n; ++i) {int key = arr[i];int left = 0, right = i - 1;// 二分查找插入位置while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] > key) {right = mid - 1;}else {left = mid + 1;}}// 將元素后移for (int j = i - 1; j >= left; --j) {arr[j + 1] = arr[j];}// 插入元素arr[left] = key;}
}

3.希爾排序

//希爾排序
void ShellSort(vector<int>&a, int n)
{/*int gap = 3;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){int end = i;int tmp = a[i + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}*/// gap > 1 預排序// gap == 1 直接插入排序int gap = n;while (gap > 1){//gap /= 2;gap = gap / 3 + 1;//除2是不用+1的 因為你能保證最后gap一定是1   gap為1就是直接插入排序  但是/3就不能保證了!for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[i + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}//PrintArray(a, n);}
}

希爾排序的這兩種實現方式的時間復雜度是一模一樣的??只是遍歷的方式不一樣

2.選擇排序

1.直接選擇排序?

void Swap(int& a, int& b) {int temp = a;a = b;b = temp;
}// 直接選擇排序函數
void SelectSort(int* a, int n) {for (int i = 0; i < n - 1; ++i) {int minIndex = i;for (int j = i + 1; j < n; ++j) {if (a[j] < a[minIndex]) {minIndex = j;}}if (minIndex != i) {Swap(a[i], a[minIndex]);}}
}

可以對其進行優化? ?比如我一次選兩個數出來

但是這個時候swap的時候要確認一下特殊情況

同時如果是有序的就可以直接break了 不用那么麻煩


void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){bool exchange = false;for (int i = 1; i < n-j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = true;}}if (exchange == false){break;}}
}

2.堆排序

// 左右子樹都是大堆/小堆
void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){// 選出左右孩子中大的那一個if (child + 1 < n && a[child + 1] > a[child]){++child;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}//堆排序
void HeapSort(int* a, int n)
{// 建堆 -- 向下調整建堆 -- O(N)for (int i = (n - 1 - 1) / 2; i >= 0; --i){AdjustDown(a, n, i);}// 自己先實現 -- O(N*logN)int end = n - 1;while (end > 0){Swap(&a[end], &a[0]);AdjustDown(a, end, 0);--end;}
}

?3.交換排序

1.冒泡排序


//冒泡排序// 最壞:O(N^2)
// 最好:O(N)
void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){bool exchange = false;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = true;}}if (exchange == false){break;}}
}

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

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

相關文章

計算機視覺圖像處理基礎系列:濾波、邊緣檢測與形態學操作

計算機視覺圖像處理基礎系列&#xff1a;濾波、邊緣檢測與形態學操作 一、前言二、濾波&#xff1a;圖像的精細化處理?2.1 濾波基礎概念?2.1.1 濾波的本質?2.1.2 圖像噪聲來源與類型? 2.2 線性濾波?2.2.1 均值濾波?2.2.2 高斯濾波? 2.3 非線性濾波?2.3.1 中值濾波? 三…

第八課:在SD中安裝拓展插件

3種拓展安裝方式教學 點擊Extensions安裝方式 經由內置列表查詢安裝&#xff0c;打開Available&#xff0c;輸入鏈接&#xff0c;點擊Load from:&#xff0c;然后篩選后點擊Install通過鏈接安裝&#xff0c;復制代碼倉庫地址&#xff0c;github/gitee&#xff0c;輸入Install …

tomcat的web三大組件Sciidea搭建web/maven的tomcat項目

文章目錄 1. web項目的搭建1. 創建web項目2.修改web.xml版本3.添加servlet、jsp依賴4.servlet示例&#xff08;使用注解&#xff09;5.配置tomcat6.添加artifact7.部署8.啟動tomcat、訪問9.打war包10.部署到tomcat 2.maven的項目搭建1.創建項目圖解 2.tomcat啟動方式圖解idea打…

ZKmall開源商城多云高可用架構方案:AWS/Azure/阿里云全棧實踐

隨著企業數字化轉型的加速&#xff0c;云計算服務已成為IT戰略中的核心部分。ZKmall開源商城作為一款高性能的開源商城系統&#xff0c;其在多云環境下的高可用架構方案備受關注。下面將結合AWS、Azure和阿里云三大主流云平臺&#xff0c;探討ZKmall的多云高可用架構全棧實踐。…

【代碼模板】如何用FILE操作符打開文件?fopen、fclose

#include "stdio.h" #include "unistd.h"int main(int argc, char *argv[]) {FILE *fp fopen("1.log", "wb");if (!fp) {perror("Failed open 1.log");return -1;}fclose(fp); }關于權限部分參考兄弟篇【代碼模板】C語言中…

Airflow+Spark/Flink vs. Kettle

在遷移億級&#xff08;單表超過1.3億&#xff09;結構化數據&#xff08;達夢→星環&#xff09;的場景下&#xff0c;Airflow&#xff08;結合分布式計算框架&#xff09;的綜合效果優于Kettle&#xff0c;以下是詳細對比與方案建議&#xff1a; 一、核心對比&#xff1a;Air…

多電機顯示并排序

多電機顯示并排序 要實現根據后端傳遞過來的驅動電機數據的數量來顯示不同數量的數據列表&#xff0c;我們可以使用 Vue 的 v-for 指令來遍歷 driveMotorData 數組&#xff0c;并為每個驅動電機生成一個數據列表。這樣&#xff0c;無論后端傳來多少個驅動電機的數據&#xff0…

圖漾相機——C#語言屬性設置

文章目錄 前言1.示例程序說明2.SDK API功能介紹2.1 ListDevice 枚舉設備2.2 Open 打開相機2.3 OpenDeviceByIP 通過IP打開設備2.4 Close 關閉設備2.5 DeviceStreamEnable 取流使能2.6 DeviceStreamFormatDump 取流分辨率2.7 DeviceStreamFormatConfig 取流分辨率配置2.8 Device…

thinkphp8.0上傳圖片到阿里云對象存儲(oss)

1、開通oss,并獲取accessKeyId、accessKeySecret <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><tit…

跳躍連接(Skip Connection)與殘差連接(Residual Connection)

1. 跳躍連接&#xff08;Skip Connection&#xff09;的基本概念 跳躍連接是一種在深度神經網絡中廣泛應用的技術&#xff0c;它允許信息在網絡中跨層直接傳遞。在傳統的神經網絡里&#xff0c;每一層的輸出僅僅是前一層輸出經過特定變換后的結果。而在具備跳躍連接的網絡中&a…

【硬件視界9】網絡硬件入門:從網卡到路由器

??引言: 專欄:《硬件視界》 【硬件視界8】電源供應器(PSU):計算機的“心臟“ 在數字化高速發展的今天,網絡已成為我們日常生活和工作中不可或缺的基礎設施。而支撐這一基礎設施的核心要素,便是各種各樣的網絡硬件設備。從連接計算機到網絡的網絡適配器,到負責數據轉發與…

最小生成樹理論

1. 基本定義 生成樹&#xff1a;在一個連通無向圖中&#xff0c;一個生成樹是包含所有頂點且邊數為 n?1&#xff08;n為頂點數&#xff09;的無環連通子圖。 最小生成樹&#xff1a;在所有生成樹中&#xff0c;邊權和最小的那一棵樹。也就是說&#xff0c;若每條邊有一個非負…

STM32 HAL庫 CANFD配置工具

用法說明&#xff1a; 該工具適用于STM32HAL庫&#xff0c;可一鍵生成CANFD的HAL庫配置代碼。計算依據為HAL庫&#xff0c;并參考ZLG標準。 軟件界面&#xff1a; 倉庫地址&#xff1a; HAL CANFD Init Gen: 適用于STM32控制器的HAL庫 版本說明&#xff1a; V1.2.0 &#x…

【11408學習記錄】考研英語長難句解析 | 語法拆分+寫作模板+真題精講(附高分秘籍)

2025.04.05 英語語法總結——長難句并列句并列連詞并列句的省略 寫作書信寫作第二段注意 第三段落款 每日一句詞匯第一步&#xff1a;辨別第二步&#xff1a;斷開第三步&#xff1a;簡化 英語 語法總結——長難句 長難句有兩個特點&#xff1a;長、難。 之所以又長又難就是因…

實用的alias別名命令——比2=1+1簡單的基礎命令

目錄 alias命令的用處alias命令的寫法讓alias別名永久存在的辦法下篇預告 alias命令的用處 別名&#xff0c;就是linux系統中的命令的別稱&#xff0c;而alias命令&#xff0c;可以顯示linux系統當前設定的全部別名&#xff0c;當然&#xff0c;也可以自己定義一個別名。 ali…

Kafka 中的批次

在 Kafka 中&#xff0c;批次&#xff08;Batch&#xff09; 是生產者發送消息的一個重要概念。它對 Kafka 的性能、吞吐量、延遲等有很大影響。批量處理可以使消息發送更高效&#xff0c;減少網絡往返和磁盤寫入的開銷。 下面我將詳細解釋 Kafka 中的批次機制&#xff0c;包括…

聯合、枚舉、類型別名

數據類型&#xff1a; 已學--整數、實數、字符、字符串、數組、指針、結構待學--向量&#xff08;vector&#xff09;類型&#xff1a;優于數組非主流的類型--聯合&#xff08;union&#xff09;、枚舉&#xff08;enum&#xff09; 一、聯合 聯合類似于結構&#xff0c;可以容…

form+ffmpeg+opus錄音壓縮音頻

說明&#xff1a; formffmpegopus錄音壓縮音頻 效果圖&#xff1a; step1:opus格式錄音 C:\Users\wangrusheng\RiderProjects\WinFormsApp11\WinFormsApp11\Form1.cs using System; using System.Diagnostics; using System.IO; using System.Windows.Forms;namespace WinFo…