數據結構排序

目錄

1、插入排序

2、希爾排序

3、堆排序

4、直接選擇排序

5、快排

6、歸并排序

補:計數排序


1、插入排序

void InsertSort(int* arr, int n)
{int i = 0;for (int i = 0; i + 1 < n; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}}

?另一種寫法

INSERTION-SORT

源碼

for j=2 to A.legthkey=A[j]i=j-1whlie i>0 and A[i]>keyA[i+1]=A[i]i=i-1A[i+1]=key

插入排序

比方說手上有6張撲克牌-5 2 4 6 1 3通過插入排序

即從j=2開始(key=2)比較key與A[i] (i=j-1也就是2這張牌的前一張牌5比較)并完成交換數值

把第一張key排好后j++=3再來循環

c語言實現

#include<stdio.h>int main()
{int j ;int arr[6] = { 5,2,4,6,1,3 };int sz = sizeof(arr) / sizeof(arr[0]);for (j=1; j < sz; j++){int key = arr[j];int i = j - 1;  //arr[i]>arr[j]不行嗎while (i >=0 && arr[i] > key)//升序排列{arr[i + 1] = arr[i];//為什么不能寫成arr[j]=arr[i]i = i - 1;}arr[i + 1] = key;}return 0;
}
  1. arr[i]比較的是key的值,而不是arr[j]的值,因為arr[j]在while循環中會改變
  2. 同理

2、希爾排序

希爾排序法?稱縮?增量法。希爾排序法的基本思想是:先選定?個整數(通常是gap=n/3+1),把 待排序?件所有記錄分成各組,所有的距離相等的記錄分在同?組內,并對每?組內的記錄進?排 序,然后gap=gap/3+1得到下?個整數,再將數組分成各組,進?插?排序,當gap=1時,就相當于 直接插?排序。它是在直接插?排序算法的基礎上進?改進?來的,綜合來說它的效率肯定是要?于直接插?排序算法的。

每一組的排序都是插入排序

int gap = n / 3 + 1;
for (int i = 0; i + gap < n; i+gap)
{int end = i;int tmp = arr[end + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];end-=gap;}else{break;}}arr[end + gap] = tmp;
}

完整代碼

void ShellSort(int* arr, int n)
{int i = 0;int gap = n;while (gap > 1){gap = gap/3 +1;for ( i = 0; i + gap < n; i ++){int end = i;int tmp = arr[end + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tmp;}}}

3、堆排序

void AdjustDown(DataType* arr, int parent, int n)
{int child = 2 * parent + 1;while (child < n){if (child + 1 < n && arr[child] < arr[child + 1]){child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = 2 * child + 1;}else{break;}}
}void HeapSort(int* arr, int n)
{int i = 0;//用向下調整算法建堆//循環從下至上for (i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(arr, i, n);}int end = n - 1;while (end > 0){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}}

4、直接選擇排序

未優化

void SelectSort1(int* arr, int n)
{int mini;for (int i = 0; i < n - 1; i++){mini = i;for (int j = i + 1; j < n; j++){if (arr[j] < arr[mini]){mini = j;}}Swap(&arr[i], &arr[mini]);}
}

優化

void SelectSort(int* arr, int n)
{int begin = 0;int end = n - 1;while (begin < end){int maxi = begin, mini = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] > arr[maxi]){maxi = i;}if (arr[i] < arr[mini]){mini = i;}}if (begin == maxi){maxi = mini;}Swap(&arr[begin], &arr[mini]);Swap(&arr[end], &arr[maxi]);++begin;--end;}}

5、快排

快速排序是Hoare于1962年提出的?種?叉樹結構的交換排序?法,其基本思想為:任取待排序元素 序列中的某元素作為基準值,按照該排序碼將待排序集合分割成兩?序列,左?序列中所有元素均? 于基準值,右?序列中所有元素均?于基準值,然后最左右?序列重復該過程,直到所有元素都排列 在相應位置上為?。

int _QuickSort(int* arr, int left, int right)
{//left從左往右找比基準值大的數據//right從右往左找比基準值小的數據int keyi = left;left++;while (left <= right){while (left <= right &&arr[left] < arr[keyi]){left++;}//left找到了最大位置while (left <= right &&arr[right] > arr[keyi]){right--;}if (left <= right){Swap(&arr[left++], &arr[right--]);}}Swap(&arr[keyi], &arr[right]);return right;
}//雙指針法
int _QuickSort3(int* arr, int left, int right)
{int key = left, slow = left, fast = left + 1;while (fast <= right){if (arr[fast] < arr[key] && ++slow != fast){Swap(&arr[slow], &arr[fast]);}fast++;}Swap(&arr[key], &arr[slow]);return slow;
}void QuickSort(int* arr, int left, int right)
{if (left >= right){return;}int keyi= _QuickSort(arr, left, right);QuickSort(arr, left,keyi-1);QuickSort(arr, keyi+1, right);}

6、歸并排序

void _MergeSort(int* arr,int left,int right,int* tmp)
{if (left >= right){return;}int mid = (left + right) / 2;//[left,mid] [mid+1,right]_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid + 1, right, tmp);//合并//[left,mid] [mid+1,right]int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){tmp[index++] = arr[begin1++];}else {tmp[index++] = arr[begin2++];}}//要么begin1越界  要么begin2越界while (begin1 <= end1){tmp[index++] = arr[begin1++];}while (begin2 <= end2){tmp[index++] = arr[begin2++];}//[left,mid] [mid+1,right]//把tmp中的數據拷貝回arr中for (int i = left; i < right; i++){arr[i] = tmp[i];}
}void MergeSort(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr, 0, n - 1, tmp);free(tmp);
}

補:計數排序

計數排序?稱為鴿巢原理,是對哈希直接定址法的變形應?。操作步驟:

1)統計相同元素出現次數

2)根據統計的結果將序列回收到原來的序列中

void CountSort(int* arr, int n)
{int max = arr[0], min = arr[0];for (int i = 0; i < n; i++){if (arr[i] > max){max = arr[i];}if (arr[i] < min){min = arr[i];}}int range = max - min + 1;int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail:");exit(1);}memset(count, 0, sizeof(int) * range);for (int i = 0; i < n; i++){count[arr[i] - min]++;}int index = 0;for (int i = 0; i < range; i++){while (count[i]--){arr[index++] = i + min;}}
}

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

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

相關文章

Spring聲明式事務生效是有條件滴!

在日常工作中&#xff0c;經常使用Transactional 注解進行事務的聲明&#xff0c;但如果發現事務未生效&#xff0c;可以從下面幾個方面進行排查。 常見失效場景總結 場景原因解決方案內部方法調用繞過了Spring代理注入自身或使用AopContextprivate方法AOP無法增強改為public方…

Code Composer Studio快捷鍵

文本編輯 編輯、查找、替換功能快捷鍵 功能快捷鍵撤銷CutZ重做CutY剪切CtrlX復制CtrlC粘貼CtrlV刪除Delete全選CtrlA代碼塊選中AltShiftA查找、替換Ctrl F查找下一個匹配的字符串CtrlK查找上一個匹配的字符串CtrlShiftK查看接口注釋&#xff08;文檔&#xff09;F2查看函數幫…

從認識AI開始-----生成對抗網絡(GAN):通過博弈機制,引導生成

前言 生成對抗網絡&#xff08;GAN&#xff09;是lan J. Goodfellow團隊在2014年提出的生成架構&#xff0c; 該架構自誕生起&#xff0c;就產生了很多的話題&#xff0c;更是被稱為生成對抗網絡是“新世紀以來機器學習領域內最有趣的想法”。如今&#xff0c;基于生成對抗網絡…

限流算法java實現

參考教程&#xff1a;2小時吃透4種分布式限流算法 1.計數器限流 public class CounterLimiter {// 開始時間private static long startTime System.currentTimeMillis();// 時間間隔&#xff0c;單位為msprivate long interval 1000L;// 限制訪問次數private int limitCount…

Maven 構建性能優化深度剖析:原理、策略與實踐

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

JS手寫代碼篇---手寫深拷貝

17、深拷貝 深拷貝與淺拷貝最大的不同就是對象的屬性是嵌套對象&#xff0c;會新建一個對象 步驟&#xff1a; 判斷是否為對象判斷是否為i數組或者對象&#xff0c;給新的有個容器遍歷循環&#xff0c;如果是對象要遍歷循環&#xff0c;采用遞歸 function deepCopy(obj){// …

【react實戰】如何實現監聽窗口大小變化

在日常開發場景中&#xff0c;監聽窗口變化是一個比較常見又很重要的業務功能&#xff0c;其實實現起來也很簡單&#xff0c;今天就來記錄一下具體的實現以及注意事項。 實現思路 在 React 中&#xff0c;可以通過監聽 window 的 resize 事件來檢測可視區域&#xff08;viewp…

AVCap視頻處理成幀和音頻腳本

###############處理原視頻&#xff0c;使其格式和原數據一樣 import os import cv2 import subprocess import json from PIL import Image from pydub import AudioSegmentimport sys import shutil # &#x1f539; 第一步&#xff1a;強制檢測并設置FFmpeg路徑 &#x1f5…

數據冗余對企業運營的隱性成本

從客戶管理到供應鏈優化&#xff0c;再到市場分析&#xff0c;數據無處不在&#xff0c;數據已成為企業運營的核心驅動力。然而&#xff0c;隨著企業IT系統的多樣化和數據量的激增&#xff0c;數據冗余&#xff08;Data Redundancy&#xff09;問題逐漸浮出水面&#xff0c;成為…

HTML原生日期插件增加周次顯示

<div id="app" class="box box-info" style="border-top-color:white;"><!-- // 日期部分 --><div class="date-picker-container" style="position: relative; max-width: 200px;"><!-- 日期輸入框 -…

滲透測試PortSwigger Labs:遭遇html編碼和轉義符的反射型XSS

1 處是我們輸入的標簽被服務器 html 編碼后返回&#xff0c;被瀏覽器當作字符串顯示出來&#xff0c;無法執行 javascript 2 處是唯一能控制的地方&#xff0c;正好在script標簽范圍內&#xff0c;可以嘗試構造 依然存在轉移單引號&#xff0c;我們輸入轉義符\讓服務器添加的轉…

Ansible 錯誤處理:確保高效自動化

當 Ansible 收到命令的非零返回碼或模塊故障時,默認情況下,它會停止在該主機上的執行,并在其他主機上繼續執行。但是,在某些情況下,您可能需要不同的行為。有時非零返回碼表示成功。有時您希望一臺主機上的故障導致所有主機上的執行停止。Ansible 提供了處理這些情況的工具…

【無標題】NP完全問題的拓撲對偶統一解法 ——四色問題到P=NP的普適框架

NP完全問題的拓撲對偶統一解法 ——四色問題到PNP的普適框架 **摘要** 本文提出基于**拓撲膨脹-收縮對偶性**的計算理論框架&#xff0c;突破傳統NP完全性理論局限。通過將離散組合問題轉化為連續幾何問題&#xff0c;并引入規范場量子求解機制&#xff0c;實現四色問題、子…

【Zephyr 系列 19】打造 BLE 模塊完整 SDK:AT 命令系統 + 狀態機 + NVS + OTA 一體化構建

??關鍵詞:Zephyr、BLE 模塊、SDK 構建、AT 命令框架、有限狀態機、Flash 配置、MCUboot OTA ??面向讀者:希望將 BLE 項目標準化、封裝化、支持量產使用的開發團隊與架構師 ??預計字數:5500+ 字 ?? 背景與目標 在完成多個 BLE 功能模塊后,一個企業級產品往往需要:…

機器學習核心概念速覽

機器學習基本概念 有監督學習分類、回歸無監督學習聚類、降維 一維數組 import numpy as np data np.array([1,2,3,4,5]) print(data) print(data.shape) print(len(data.shape))[1 2 3 4 5] (5,) 1二維數組 data2 np.array([[1,2,3],[4,5,6]]) print(data2) print(data2…

在 Java 中實現一個標準 Service 接口,并通過配置動態選擇具體實現類供 Controller 調用

在 Java 中實現一個標準 Service 接口&#xff0c;并通過配置動態選擇具體實現類供 Controller 調用&#xff0c;是解耦和靈活擴展的常見設計模式。 需求分析 當你需要開發一個需要靈活切換業務實現的系統&#xff0c;比如不同環境使用不同策略&#xff08;如測試環境用Mock實…

input+disabled/readonly問題

背景&#xff1a; vue2elementui <el-input v-model"inputForm.projectName" class"input-font" :disabled"projectDisabled" placeholder"請選擇" :readonly"isReadonly"><el-button slot"append"…

Office2019下載安裝教程(2025最新永久方法)(附安裝包)

文章目錄 Office2019安裝包下載Office2019一鍵安裝步驟&#xff08;超詳細&#xff01;&#xff09; 大家好&#xff01;今天給大家帶來一篇超實用的Office2019專業版安裝教程&#xff01;作為日常辦公和學習的必備軟件&#xff0c;Office的安裝對很多朋友來說可能有點復雜&…

【編譯工具】(版本控制)Git + GitHub Actions:自動化工作流如何讓我的開發效率提升200%?

目錄 引言&#xff1a;現代開發中版本控制和 CI/CD 的重要性 一、Git&#xff1a;為什么它是版本控制的首選&#xff1f; &#xff08;1&#xff09;Git 的核心優勢 &#xff08;2&#xff09;Git 高效工作流示例 ① 功能開發流程 ② 緊急修復流程 二、GitHub Acti…

碼蹄杯真題分享

我的個人主頁 我的專欄&#xff1a; 人工智能領域、java-數據結構、Javase、C語言&#xff0c;MySQL&#xff0c;希望能幫助到大家&#xff01;&#xff01;&#xff01; 點贊&#x1f44d;收藏? 1&#xff1a;房間打掃&#xff08;題目鏈接&#xff09; 思路&#xff1a;要想…