【C/C++】排序算法代碼實現

這里,匯總了常見的排序算法具體代碼實現。使用C語言編寫。

排序算法實現

  • 插入排序
  • 冒泡排序
  • 選擇排序
  • 快速排序
  • 希爾排序
  • 歸并排序

插入排序

#include <stdio.h>
#include <stdlib.h>void InsertSort(int arr[],int n){int i,j,temp;for(i = 1;i < n;i++){   //將各元素插入已排好的序列中if(arr[i] < arr[i-1]){  //若當前元素小于前驅temp = arr[i];    //暫存當前元素for(j = i-1;j >= 0 && arr[j] > temp;j--)  //檢查前面所有排好的元素arr[j+1] = arr[j];  //所有大于temp的元素后移arr[j+1] = temp;  //復制到插入位置(j+1:j--多減了一個要加回來)}}
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);InsertSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

冒泡排序

#include <stdio.h>
#include <stdlib.h>void bubbleSort(int arr[],int n){for(int i=0;i<n-1;i++){//外層循環,n個元素需要循環n-1次for(int j=0;j<n-1-i;j++){  //內層循環,n個元素第i趟比較n-i次if(arr[j]>arr[j+1]){  //將較大的元素后移int temp = arr[j+1];arr[j+1] = arr[j];arr[j] = temp;}}}
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);bubbleSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

選擇排序

#include <stdio.h>
#include <stdlib.h>void selectSort(int a[],int n){int i,j,min = 0;for(i=0;i<n-1;i++){min = i;for(j=i+1;j<n;j++){if(a[j]<a[min]){  //尋找最小的數min = j;  //尋找最小的索引保存}}if(i!= min){int tmp = a[i];a[i] = a[min];a[min] = tmp;}}
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);selectSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

快速排序

#include <stdio.h>
#include <stdlib.h>void quickSort(int a[],int begin,int end){if(begin>=end) return;  //遞歸結束條件int i = begin,j = end,flag = a[i],tmp = 0;  //第一個為基準while(i!=j){while((i<j)&&(a[j]>flag)) j--; //從最后一個元素出發,每次循環j--,直到找到比flag小的數字,記錄下標while((i<j)&&(a[i]<=flag)) i++;  //從開頭元素出發,每次循環i++,直到找到比flag大的數字,記錄下標if(j>i){  //交換tmp = a[i];a[i] = a[j];a[j] = tmp;}}a[begin] = a[i];a[i] = flag;  //交換基準數與i和j相遇的位置的數quickSort(a,begin,i-1);  //左子數組遞歸quickSort(a,i+1,end);   //右子數組遞歸
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);quickSort(a,0,7);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

希爾排序

#include <stdio.h>
#include <stdlib.h>void shellSort(int a[], int n){int i,j,gap;  // gap為步長,每次減為原來的一半for (gap = n / 2; gap > 0; gap /= 2){  // 共gap個數組,對每一組都執行直接插入排序for (i = 0; i < gap; i++) {for (j = i + gap; j < n; j += gap){  // 如果a[j]<a[j-gap],則尋找a[j]位置,并將后面的位置都后移if (a[j] < a[j - gap]){int tmp = a[j];int k = j - gap;while (k >= 0 && a[k] > tmp){a[k + gap] = a[k];k -= gap;}a[k + gap] = tmp;}}}}
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);shellSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

歸并排序

#include <stdio.h>
#include <stdlib.h>void Merge(int arr[], int tmp[], int start,int mid, int end){//合并小組并排序int i = start;  //i標識,左小組的第一個元素位置int j = mid + 1;//j標識,右小組的第一個元素位置int k = start;  //tmp當前小組存放的起始位置while (i < mid + 1 && j < end + 1){//左小組越界或右小組越界才能退出if (arr[i] <= arr[j])tmp[k++] = arr[i++];elsetmp[k++] = arr[j++];}while (j < end + 1){  //如果右邊小組沒有越界tmp[k++] = arr[j++];}while (i < mid + 1){  //如果左邊小組沒有越界tmp[k++] = arr[i++];}for (i = start; i <= end; i++){arr[i] = tmp[i];}
}void MergeS(int arr[], int tmp[], int start, int end){//劃分小組,現在沒有endif (start < end){int mid = (start+end)/2;MergeS(arr, tmp, start, mid);MergeS(arr, tmp, mid + 1, end);Merge(arr, tmp, start, mid, end);}
}void mergeSort(int arr[], int len){int *tmp = (int *)malloc(sizeof(int)*len);//開了一個排序后結果保存的臨時數組MergeS(arr, tmp, 0, len - 1);//嵌套調用free(tmp);
}int main()
{int a[] = {12,32,61,5,9,63,89,2};for(int i=0;i<8;i++)printf("%d ",a[i]);mergeSort(a,8);printf("\n");for(int i=0;i<8;i++)printf("%d ",a[i]);return 0;
}

不同排序算法之間的比較:
在這里插入圖片描述

以上屬個人見解。
??希望對您有幫助,您的支持是我創作最大的動力!

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

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

相關文章

Pinia狀態持久化——插件pinia-plugin-persistedstate

pinia-plugin-persistedstate 旨在通過一致的 API 為 Pinia Store 提供持久化存儲。如果希望保存一個完整的 Store&#xff0c;或者需要細粒化配置 storage 和序列化的方式&#xff0c;該插件都提供了相應的功能&#xff0c;并且可以在想要持久化的 Store 上使用相同的配置。 …

Python 異常的傳遞性

實例 這里就簡單用2個function來演示一下異常的傳遞性 func1 這里num 1/0明顯是一個ZeroDivisionError錯誤&#xff0c;作為演示 def func1():print("fun1 開始執行")num 1 / 0print("func1 結束執行") func2 def func2():print("func2 開始執…

tomcat國密ssl測試

文章目錄 程序包準備部署配置訪問測試 程序包準備 下載 tomcat8.5 https://www.gmssl.cn/gmssl/index.jsp 下載 tomcat 國密組件及證書 本次測試所有的程序文件均已打包&#xff0c;可以直接 點擊下載 部署配置 自行完成 完成centos 的jdk配置。 部署tomcat,將 gmssl4t.jar…

數字孿生農村供水工程平臺:為鄉村振興注入新活力

隨著科技的不斷進步&#xff0c;數字孿生技術逐漸成為各行業創新發展的重要驅動力。在水利領域&#xff0c;數字孿生農村供水平臺以其獨特的優勢&#xff0c;為農村供水系統帶來了革命性的變革。本文將為您詳細介紹數字孿生農村供水平臺的核心特點及優勢&#xff0c;帶您領略智…

深度學習常見激活函數:ReLU,sigmoid,Tanh,softmax,Leaky ReLU,PReLU,ELU整理集合,應用場景選擇

文章目錄 1、ReLU 函數&#xff08;隱藏層中是一個常用的默認選擇&#xff09;1.1 優點1.2 缺點 2、sigmoid 函數2.1 優點2.2 缺點 3、Tanh 函數3.1 優點3.2 缺點 4、softmax 函數&#xff08;多分類任務最后一層都會使用&#xff09;5、Leaky ReLU 函數5.1 優點5.2 缺點 6、PR…

mongo DB -- aggregate分組查詢后字段展示

一、分組查詢 在mongoDB中可以使用aggregate中的$group操作對集合中的文檔進行分組,但是查詢后的數據不顯示其他字段,只顯示分組字段 aggregate進行分組示例 db.collection.aggregate([{$group: {_id: "$field"}},]) 查詢后顯示 展開只顯示兩個字段 二、顯示所有字段…

APM工具skywalking部署

一 整體架構 整個架構&#xff0c;分成上、下、左、右四部分&#xff1a; 上部分 Agent &#xff1a;負責從應用中&#xff0c;收集鏈路信息&#xff0c;發送給 SkyWalking OAP 服務器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 數據信息。而我們目前采用的是&…

Rust - cargo項目里多個二進制binary crate的編譯運行

目錄 foo - Cargo.toml - src - - main.rs - - bin - - - other-bin.rs將除默認入口文件外待作為二進制crate處理的文件放在src/bin目錄下 方法一&#xff1a; 命令行增加配置項 --bin xxx cargo run --bin foo // 注意! 這里是包名&#xff0c;不是main cargo run --bin o…

SQL基礎理論篇(九):存儲過程

文章目錄 簡介存儲過程的形式定義一個存儲過程使用delimiter定義語句結束符存儲過程中的三種參數類型流控制語句 存儲過程的優缺點參考文獻 簡介 存儲過程Stored Procedure&#xff0c;SQL中的另一個重要應用。 前面說的視圖&#xff0c;只能勉強跟編程中的函數相似&#xff…

MySQL -- JDBC

1、JDBC是什么&#xff1a; 是SUN公司制定的一套接口(interface)。接口都有調用者和實現者。面向接口調用、面向接口寫實現類&#xff0c;這都屬于面向接口編程。 2、在使用JDBC的六個步驟&#xff1a; 1.注冊驅動&#xff08;告訴Java程序&#xff0c;即將連接的是哪個品牌…

業務系統上云后,如何滿足員工移動辦公快速訪問業務系統的需求?

在企業業務上云的大趨勢下&#xff0c;SaaS應用、云端辦公協同工具等多種遠程辦公應用系統開始大規模普及&#xff0c;企業員工可以隨時隨地訪問云上業務數據。然而現實情況卻十分“打臉”&#xff0c;企業隨時隨地要訪問云上業務的需求越迫切&#xff0c;問題就越大。由于多種…

算法通關村第十二關|白銀|字符串經典基礎面試題

1.反轉問題 1.1 反轉字符串 原題&#xff1a;力扣344. 要求原地修改。 public void reverseString(char[] s) {if (s null || s.length() 0) {return;}int n s.length;for (int left 0, right n - 1; left < right; left, right--) {char temp s[left];s[left] s…

小程序訂閱消息

wx.requestSubscribeMessage({tmplIds: [2IdqlWrqSbjAurzIuW8imeK-ftS8gbhYdZ0icdE],success(res) {console.log(res);// 處理用戶授權結果},fail(err) {console.error(err);// 處理授權請求失敗}});

白楊SEO:2B企業營銷是什么?當下主流的短視頻直播平臺有哪些?企業營銷要做短視頻直播選哪個平臺更好?

今天白楊SEO就正式來講講2B企業營銷選擇哪個短視頻直播平臺更好&#xff1f; 圖片在公眾號&#xff1a;白楊SEO上看。 文章大綱提前看&#xff1a; 1、先說說2B企業營銷是什么&#xff1f; 2、當下主流的短視頻直播平臺有哪些&#xff1f; 3、2B企業營銷要做短視頻直播選哪…

重磅!1區、60年老牌期刊被踢?共5本被剔除!11月SCIE/SSCI期刊目錄更新!

期刊動態&#xff1a;2023年11月SCI、SSCI期刊目錄更新 2023年11月20日&#xff0c;科睿唯安更新了WOS期刊目錄&#xff0c;繼上次10月WOS期刊目錄剔除7本SCIE&SSCI期刊之后&#xff0c;此次11月更新又有5本期刊發生變動&#xff0c;其中有4本SCIE期刊被剔除&#xff0c;1…

Postgresql根據兩表相同字段更新其中一個表的其他數據

有兩個表 table1&#xff08;id,pcode,pname,type&#xff09; 初始數據只有id、pcode&#xff0c;pname、type為空table2&#xff08;id,pcode,pname,type&#xff09; 根據table1和table的相同字段pcode&#xff0c;用table2的數據更新table1的pname和type字段。 例如&…

微信運營神器:從群發到批量添加,讓你的微信營銷更輕松

在這個數字化時代&#xff0c;微信已經成為了我們生活中不可或缺的一部分。對于許多企業和個人來說&#xff0c;微信營銷也是非常重要的一部分。但是&#xff0c;微信營銷并不是一件容易的事情&#xff0c;需要花費大量的時間和精力。為了解決這個問題&#xff0c;今天我們將向…

Linux本地MinIO存儲服務遠程調用上傳文件

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《Linux》《Cpolar》 ??感謝大家點贊&#x1f44d;收藏?評論?? 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;…

淘寶返利APP草柴如何綁定淘寶賬號?

草柴APP是一款淘寶、天貓、京東大額優惠券領取及購物返利省錢工具。通過草柴APP綁定淘寶賬號&#xff0c;可領取淘寶大額內部隱藏優惠券&#xff0c;領取成功再購物可享券后價優惠&#xff0c;確認收貨后可獲得淘寶返利。 淘寶返利APP草柴如何綁定淘寶賬號&#xff1f; 1、手…

Docker 快速搭建 Gitlab 服務

linux環境&#xff1a; 使用 vim 編輯 hosts 文件&#xff1a; vim /etc/hosts按 I 進入編輯模式&#xff0c;在文件末行追加上虛擬機的 IP 和要設置的域名&#xff1a; 192.168.1.17 gitlab.kunwu.toplwindows環境&#xff1a; Windows 系統的 hosts 文件位于 C:\Windows\S…