經典排序算法復習----C語言

經典排序算法復習

分類

  • 交換類
    • 冒泡
    • 快排
  • 分配類
    • 計數排序
    • 基數排序
  • 選擇類
    • 選擇排序

    • 堆排序

  • 歸并類
    • 歸并排序
  • 插入類
    • 直接插入排序

    • 希爾排序

    • 折半插入排序

冒泡排序

基于交換。每一輪找最大值放到數組尾部

//冒泡排序
void bubSort(int* arr,int size){bool sorted=false;while(size--&&!sorted){sorted=true;//檢查某一趟排序是否已完全排好for(int i=0;i<size;i++){// printf("下標為%d的元素和%d的元素正在比較\n",i,i+1);if(arr[i+1]<arr[i]) {swap(&arr[i+1],&arr[i]);sorted=false;}}// printf("第%d趟已比完\n",size);}
}
  1. 比較趟數是size-1次,for循環體循環次數為"當前的size"次,即每趟比較次數

  2. sorted提高代碼效率,只要排好序就不需再進入下一趟排序

在這里插入圖片描述

快速排序

冒泡排序優化版本,每趟將數分為大于某基準和小于某基準的兩部分

//快速排序之分區
int partition(int* arr, int low, int high) { //->返回pivot下標int pivot = arr[high];//用low下標值做pivotint i = low, j;for (j=low; j < high; j++) {if (arr[j] < pivot) {swap(&arr[i], &arr[j]);//將小于pivot的元素交換到左側i++;//大于pivot區域的第一個下標加1printf("大于pivot區域的第一個下標值為%d\n", i);}}swap(&arr[i], &pivot);//把pivot歸位return i;
}
void QuickSort(int* arr, int low,int high) {if (low >= high) return;int p=partition(arr, low, high);QuickSort(arr, low, p - 1);QuickSort(arr, p + 1, high);
}
  1. i-1為已確定的小于pivot區域的下標值

在這里插入圖片描述

  1. 傳參high=size-1,否則越界

歸并排序

二路歸并,遞歸實現

//歸并排序之兩數組合并
void merge(int* arr, int low, int mid, int high) {//創建臨時數組int* tmp_arr = (int*)malloc(sizeof(int) * (high - low + 1));int i = low, k = low;int j = mid + 1;while (i<=mid&&j<=high)//[low---mid]/ [mid+1---high]兩個數組tmp_arr[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];while (i <= mid) tmp_arr[k++] = arr[i++];while (j <= high) tmp_arr[k++] = arr[j++];//復制到原數組for (i = low,k=0; i <= high; i++,k++)arr[i] = tmp_arr[k];
}
void MergeSort(int* arr, int low, int high) {if (low >= high) return;int mid = (high + low) / 2;//分MergeSort(arr, low, mid);MergeSort(arr, mid + 1, high);//治merge(arr, low, mid, high);
}
  1. 遞歸“分”,再依次“治”;分只需兩個參數low和high,“治”需三個參數,即兩個子數組
  2. 遞歸出口:low>=high而不是low>high
  3. 每次將此次將排好序的數放到原區間內,每次動態開辟tmp_arr數組空間

堆排序

  • 大根堆:父親的權值比左右子樹權值大
  • 孩子結點下標編號:2i ,2i+1
    在這里插入圖片描述
typedef struct Heap{int* root;int length;
}Heap;
Heap* CreateHeap(int length){Heap* heap=(Heap*)malloc(sizeof(Heap));assert(heap);heap->
}
void pushHeap(Heap* heap,int arr);
int popHeap(Heap* heap);
//偽代碼
for(arr){pushHeap(heap,arr[i]);
}
for(heap){arr[i]=pop(heap)
}
//不定義結構體
void sift(int* array, int low, int high) {int parent = low, child = 2 * parent + 1;//即為左孩子int tmp = array[parent];//當前需要調整的樹的根節點while (child <= high) {//child+1 <= high為防止數組越界if (child+1 <= high && array[child] < array[child + 1]) child = child +1;//存大孩子節點編號if (tmp < array[child]) {array[parent] = array[child];parent = child; child = 2 * parent +1;//繼續向下遍歷}else break;}array[parent] = tmp;
}
void HeapSort(int* array, int size) {int i;//非葉子結點的最大編號for (i = (size-1-1) / 2; i >= 0; i--) {sift(array, i, size-1);}//建大根堆for (i = size-1; i >= 1; i--) {//循環n-1次完成堆排序swap(&array[0],&array[i]);// int tmp = array[0];// array[0] = array[i];// array[i] = tmp;sift(array, 1, i - 1);}
}

在這里插入圖片描述

  1. sift參數為low,high,high可以取到且為size-1
  2. 大根堆建立的基礎是孩子也為大根堆,所以從后往前依次建堆
  3. 最大數移到數組最后則表示其出堆,high-1

插入排序

把無序區的元素插入到有序區對應的位置

//直接插入排序(從小到大排)
void insert_sort(int* array, int size) {int j,tmp;for (int i = 1; i < size; i++) {//n趟tmp = array[i];int end = i-1;for (; end >= 0; end--) {//每趟比較次數因數據有序程度而變化,最壞是i次,則移動次數最壞是i+2次if (tmp < array[end]) array[end + 1] = array[end];else break;//如果大于等于,跳出循環!!!!end不能再--}printf("下標%d元素找到插入位置了:%d\n",i,end+1);printArray(array,size);array[end+1] = tmp;}
}

在這里插入圖片描述

  1. 找end位置,找到就跳出循環!! else break;如果不加end每次循環到1
  2. end+1<size 防止數組越界
  3. end+1為第i個節點的插入位置

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

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

相關文章

BFS解決拓撲排序(3題)

目錄 拓撲排序 1.如何排序&#xff1f; 2.如何形成拓撲排序 3.如何建圖 1.看數據稠密度 2. 根據算法流程靈活建圖 1.課程表 2.課程表2 3.火星詞典 拓撲排序 找到做事情的先后順序&#xff0c;拓撲排序的結果可能不是唯一的 1.如何排序&#xff1f; 1.找出圖中入度為…

kafka 3.5.0 raft協議安裝

前言 最近做項目&#xff0c;需要使用kafka進行通信&#xff0c;且只能使用kafka&#xff0c;筆者沒有測試集群&#xff0c;就自己搭建了kafka集群&#xff0c;實際上筆者在很早之前就搭建了&#xff0c;因為當時還是zookeeper&#xff08;簡稱ZK&#xff09;注冊元數據&#…

Unity項目接入xLua的一種流程

1. 導入xlua 首先導入xlua&#xff0c;這個不用多說 2. 編寫C#和Lua交互腳本 基礎版本&#xff0c;即xlua自帶的版本 using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; using System; using System.IO;[Serializable] public…

四次揮手詳解

文章目錄 一、四次揮手各狀態FIN_WAIT_1CLOSE_WAITFIN_WAIT_2LAST_ACKTIME_WAITCLOSE 二、雙方同時調用close()&#xff0c;FIN_WAIT_1狀態后進入CLOSING狀態CLOSING狀態 三、TIME_WAIT狀態詳解(1) TIME_WAIT狀態下的2MSL是什么MSL &#xff08;報文最大生存時間&#xff09;為…

【嵌入式 Linux 音視頻+ AI 實戰項目】瑞芯微 Rockchip 系列 RK3588-基于深度學習的人臉門禁+ IPC 智能安防監控系統

前言 本文主要介紹我最近開發的一個個人實戰項目&#xff0c;“基于深度學習的人臉門禁 IPC 智能安防監控系統”&#xff0c;全程滿幀流暢運行。這個項目我目前全網搜了一圈&#xff0c;還沒發現有相關類型的開源項目。這個項目只要稍微改進下&#xff0c;就可以變成市面上目前…

java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle

oracel 21c sql: -- 創建 School 表 CREATE TABLE School (SchoolId CHAR(5) NOT NULL,SchoolName NVARCHAR2(500) NOT NULL,SchoolTelNo VARCHAR2(8) NULL,PRIMARY KEY (SchoolId) );CREATE OR REPLACE PROCEDURE addschool(p_school_id IN CHAR,p_school_name IN NVARCHAR2,p…

解決錯誤:CondaHTTPError: HTTP 000 CONNECTION FAILED for url

解決錯誤&#xff1a;CondaHTTPError: HTTP 000 CONNECTION FAILED for url 查看channels:vim ~/.condarcshow_channel_urls: true channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/…

Apache APISIX 快速入門

文章目錄 apisix 快速入門什么是apisix有了 NGINX 和 Kong&#xff0c;為什么還需要 Apache APISIX&#xff1f;軟件架構基于 Nginx 開源版本&#xff0c;而 Nginx 并不支持動態配置&#xff0c;為什么 Apache APISIX 聲稱自己可以實現動態配置&#xff1f; 安裝配置 APISIX配置…

2025嵌入式高頻面試題解析

一、概述 到了年初&#xff0c;是求職者最活躍的時間。本文梳理了嵌入式高頻面試題&#xff0c;幫助求職者更好地準備面試&#xff0c;同時也為技術愛好者提供深入學習嵌入式知識的參考。 二、C 語言基礎 2.1 指針與數組 問題 1&#xff1a;指針和數組的區別是什么&#xf…

1.攻防世界 baby_web

題目描述這里有提示&#xff0c;初始頁面 進入題目頁面如下 很簡潔的頁面只有一行HELLO WORLD ctrlu查看了源碼也沒有信息 用burp suite抓包&#xff0c;并發送到重放器 根據提示&#xff08;初始頁面&#xff09;修改訪問index.php文件 index.php index.php 是一種常見的…

什么是三層交換技術?與二層有什么區別?

什么是三層交換技術&#xff1f;讓你的網絡飛起來&#xff01; 一. 什么是三層交換技術&#xff1f;二. 工作原理三. 優點四. 應用場景五. 總結 前言 點個免費的贊和關注&#xff0c;有錯誤的地方請指出&#xff0c;看個人主頁有驚喜。 作者&#xff1a;神的孩子都在歌唱 大家好…

【機器學習】數據預處理之數據歸一化

數據預處理之數據歸一化 一、摘要二、數據歸一化概念三、數據歸一化實現方法3.1 最值歸一化方法3.2 均值方差歸一化方法 一、摘要 本文主要講述了數據歸一化&#xff08;Feature Scaling&#xff09;的重要性及其方法。首先通過腫瘤大小和發現時間的例子&#xff0c;說明了不同…

【AIGC】語言模型的發展歷程:從統計方法到大規模預訓練模型的演化

博客主頁&#xff1a; [小????????] 本文專欄: AIGC | ChatGPT 文章目錄 &#x1f4af;前言&#x1f4af;語言模型的發展歷程&#xff1a;從統計方法到大規模預訓練模型的演化1 統計語言模型&#xff08;Statistical Language Model, SLM&#xff09;&#xff1a;統…

高效知識管理與分類優化指南:從目錄設計到實踐應用

摘要 本文旨在幫助讀者在信息爆炸時代構建高效的知識管理體系&#xff0c;提供了知識收藏目錄、瀏覽器書簽和電腦文件夾的優化分類方案。知識收藏目錄方案包括工作與項目、記錄與日常、知識管理等八大類&#xff0c;具有邊界清晰、擴展靈活、貼合實際場景等優勢。瀏覽器書簽分類…

OpenAI 實戰進階教程 - 第十二節 : 多模態任務開發(文本、圖像、音頻)

適用讀者與目標 適用讀者&#xff1a;已經熟悉基礎的 OpenAI API 調用方式&#xff0c;對文本生成或數據處理有一定經驗的計算機從業人員。目標&#xff1a;在本節中&#xff0c;你將學會如何使用 OpenAI 提供的多模態接口&#xff08;圖像生成、語音轉錄等&#xff09;開發更…

Java面試題2025-JVM

JVM 1.為什么需要JVM&#xff0c;不要JVM可以嗎&#xff1f; 1.JVM可以幫助我們屏蔽底層的操作系統 一次編譯&#xff0c;到處運行 2.JVM可以運行Class文件 2.JDK&#xff0c;JRE以及JVM的關系 3.我們的編譯器到底干了什么事&#xff1f; 僅僅是將我們的 .java 文件轉換成了…

Deepseek的MLA技術原理介紹

DeepSeek的MLA(Multi-head Latent Attention)技術是一種創新的注意力機制,旨在優化Transformer模型的計算效率和內存使用,同時保持模型性能。以下是MLA技術的詳細原理和特點: 1. 核心思想 MLA技術通過低秩聯合壓縮技術,將多個注意力頭的鍵(Key)和值(Value)映射到一…

QML初識

目錄 一、關于QML 二、布局定位和錨點 1.布局定位 2.錨點詳解 三、數據綁定 1.基本概念 2.綁定方法 3.數據模型綁定 四、附加屬性及信號 1.附加屬性 2.信號 一、關于QML QML是Qt框架中的一種聲明式編程語言&#xff0c;用于描述用戶界面的外觀和行為&#xff1b;Qu…

java項目之美妝產品進銷存管理系統的設計與開發源碼(ssm+mysql)

項目簡介 美妝產品進銷存管理系統的設計與開發實現了以下功能&#xff1a; 美妝產品進銷存管理系統的設計與開發的主要使用者分為管理員登錄后修改個人的密碼。產品分類管理中&#xff0c;對公司內的所有產品分類進行錄入&#xff0c;也可以對產品分類進行修改和刪除。產品管…

Python(pymysql包)操作MySQL【增刪改查】

下載pymysql&#xff1a; pip install pymysql 在MySQL中創建數據庫&#xff1a;unicom create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci;use unicom; 在unicom中創建數據表&#xff1a;admin create table admin(id int not null primary key auto_i…