算法與數據結構(課堂2)

排序與選擇

算法排序分類

  • 基于比較的排序算法:
    • 交換排序
      • 冒泡排序
      • 快速排序
    • 插入排序
      • 直接插入排序
      • 二分插入排序
      • Shell排序
    • 選擇排序
      • 簡單選擇排序
      • 堆排序
    • 合并排序
  • 基于數字和地址計算的排序方法
    • 計數排序
    • 桶排序
    • 基數排序

?簡單排序算法

????????冒泡排序

void sort(Item a[],int l,int r)
{for(int i=l+1;i<=r;i++){for(int j=i;j>1;j++){compswap(a[j-1],a[j]);}}
}

上述冒泡排序中,待排序元素類型是Item,算法根據Item類型元素的鍵值對數組元素a[l]~a[r]進行排序。算法中用到關于Item類型變量的一些常用運算:

typedef int Item;	//待排序元素類型
typedef Item* addr;#define key(A) A
#define less(A,B) (key(A)<key(B))
#define eq(A,B) (!less(A,B) && !less(B,A))
#define swap(A,B) {Item t=A;A=B;B=t;}
#define compswap(A,B) if(less(B,A))swap(A,B)void ItemShow(Item x)
{printf("%d \n",x);
}

其中,less(A,B)比較A和B的鍵值,等價于key(A)<key(B);

eq(A,B)等價于key(A)==key(B);

swap(A,B)交換兩個元素的值;

compswap(A,B)等價于語句if(less(A,B)) swap(A,B),即當key(B)<key(A)時,交換A和B的值

? ? ? ? 插入排序算法

?整個過程為n-1趟排序,即先將序列中第一個記錄看成是一個有序子序列,然后從第二個記錄開始,逐個進行插入,直至整個序列有序。

整個元素插入過程由算法insert來完成

void insert(Item a[],int l,int i)
{Item v=a[i];while(i>1 && less(v,a[i-1])){a[i]=a[i-1];i--;}a[i]=v;
}//插入排序算法通過反復調用insert來完成排序任務void sort(Item a[],int l,int r)
{for(int i=l+1;i<=r;i++)insert(a,l,i);
}
? ? ? ? ?二分插入排序

用二分查找方法確定插入位置的排序

? ? ? ? ?希爾排序(縮小增量法)

基本思想:先取一個正整數d1<n,把所有相隔d1的記錄放一組,組內進行直接插入排序;然后取d2<d1,重復上述分組和排序操作;直到di=1,即所有記錄放進一個組中排序為止。

快速排序算法

排序——快速排序(Quick sort)-CSDN博客

typedef int T;
//快速排序算法QuickSort的實現
void QuickSort(T a[], int p, int r)		//p,r都是下標
{if (p < r){int q = Partition(a, p, r);		//劃分QuickSort(a, p, q - 1);		//對左端快速排序QuickSort(a, q + 1, r);		//對右端快速排序}
}	//對a[0:n-1]快速排序只要調用QuickSort(a,0,n-1)//劃分(Partition)的實現
int Partition(T a[], int p, int r)
{int i = p;int j = r + 1;T x = a[p];while (true){while (a[++i] < x);while (a[--j] > x);if (i >= j)break;Swap(a[i], a[j]);}a[p] = a[j];a[j] = x;return j;
}

? ? ? ? 隨機快速排序算法

?在Partition劃分的基準值不固定為數組的第一個值,而是隨機在a[p:r]中挑選

//隨機劃分的實現
int RandomizedPartition(T a[], int p, int r)
{int i = Random(p, r);Swap(a[i], a[p]);return Partition(a, p, r);
}//隨機快速排序算法
void RandomizedQuicckSort(T a[], int p, int r)
{if (p < r){int q = RandomizedPartition(a, p, r);RandomizedPartition(a, p, q - 1);RandomizedPartition(a, q + 1, r);}
}

?合并排序算法(非就地)

數據結構和算法:歸并排序(合并排序)詳解_合并排序是采用分治策略實現對n個元素進行排序的算法,是分治法的一個典型應用和完-CSDN博客

?

//非遞歸版的合并排序算法
void MergeSort(T a[], int n)
{T* b = new T[n];int s = 1;while (s < n){MergePass(a, b, s, n);	//合并到數組bs += s;MergePass(b, a, s, n);	//合并到數組as += s;}
}
//需要的函數
//合并x[]中大小為s的相鄰子數組到y[]中
void MergePass(T x[], T[y], int s, int n)
{int i = 0;while (i <= n - 2 * s){Merge(x, y, i, i + s - 1, i + 2 * s - 1);i = i + 2 * s;}//剩下的元素個數少于2sif (i + s < n){Merge(x, y, i, i + s, n - 1);}else{for (int j = i; j <= n - 1; j++){y[i] = x[i];}}
}
//有序的合并c[l:m]和c[m+1:r]到d[l:r]
void Merge(T c[], T d[], int l, int m, int r)
{int i = l;j = m + 1;k = l;while ((i <= m) && (j <= r)){if (c[i] <= c[j]){d[k++] = c[i++];}elsed[k++] = c[j++];}if (i > m){for (int q = j; q <= r; q++){d[k++] = c[q];		//c[m+1,r]到位}}else{for (int q = i; q <= m; q++){d[k++] = c[q];		//c[l:m]到位}}
}

特殊有序集的線性時間排序算法???

? ? ? ? 計數排序算法?

//算法的實現
void CountingSort(int m,int a[],int n,int b[])
{int c[m+1];for(int i=0;i<=m;i++){c[i]=0;}for(int i=0;i<n;i++){c[a[i]]+=1;}//c[i]中存放的是a中鍵值對等于i的元素個數for(int i=1;i<=m;i++){c[i]+=c[i-1];}//c[i]中存放的是a中鍵值對小于或等于i的元素個數for(int i=n;i>0;i--){b[c[a[i-1]]-1]=a[i-1];c[a[i-1]]-=1;		//具有排序的穩定性}
}

? ? ? ? 桶排序?

基數排序?

? ? ? ? 多關鍵字排序

?

?中位數與第k小元素

T RandomizeSelect(T a[],int p,int r,int k)
//p,r是下標,要求p<=r,1<=k<=r<=r-p+1
{if(p==r)return a[p];int i=RandomizePartition(a,p,r);int j=i-p+1;		//左段的元素個數if(k<=j)return RandomizeSelect(a,p,i,k);elsereturn RandomizeSelect(a,i+1,r,k-j);
}
//為在a[0:n-1]中找第k小,只要調用RandomizeSelect(a,0,n-1,k)

?

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

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

相關文章

跨端分欄布局:從手機到Pad的優雅切換

在 UniApp X 的世界里&#xff0c;我們常常需要解決一個現實問題&#xff1a; “手機上是全屏列表頁&#xff0c;Pad上卻要左右分欄”。這時候&#xff0c;很多人會想到 leftWindow 或 rightWindow。但別急——這些方案 僅限 Web 端&#xff0c;如果你的應用需要跨平臺&#xf…

華為服務器管理工具(Intelligent Platform Management Interface)

一、核心功能與技術架構 硬件級監控與控制 全維度傳感器管理:實時監測 CPU、內存、硬盤、風扇、電源等硬件組件的溫度、電壓、轉速等參數,支持超過 200 種傳感器類型。例如,通過 IPMI 命令ipmitool sdr elist可快速獲取服務器傳感器狀態,并通過正則表達式提取關鍵指標。 遠…

Node.js Express keep-alive 超時時間設置

背景介紹隨著 Web 應用并發量不斷攀升&#xff0c;長連接&#xff08;keep-alive&#xff09;策略已經成為提升性能和資源復用的重要手段。本文將從原理、默認值、優化實踐以及潛在風險等方面&#xff0c;全面剖析如何在 Node.js&#xff08;Express&#xff09;中正確設置和應…

學習C++、QT---30(QT庫中如何自定義控件(自定義按鈕)講解)

每日一言你比想象中更有韌性&#xff0c;那些看似艱難的日子&#xff0c;終將成為勛章。自定義按鈕我們要知道自定義控件就需要我們創建一個新的類加上繼承父類&#xff0c;但是我們還要注意一個點&#xff0c;就是如果我們是自己重頭開始造控件的話&#xff0c;那么我們就直接…

【補充】Linux內核鏈表機制

專題文章&#xff1a;Linux內核鏈表與Pinctrl數據結構解析 目標&#xff1a; 深入解析Pinctrl子系統中&#xff0c;struct pinctrl如何通過內核鏈表&#xff0c;來組織和管理其多個struct pinctrl_state。 1. 問題背景&#xff1a;一個設備&#xff0c;多種引腳狀態 一個復雜的…

本地部署Dify、Docker重裝

需要先安裝一個Docker&#xff0c;Docker就像是一個容器&#xff0c;將部署Dify的空間與本地環境隔離&#xff0c;避免因為本地環境的一些問題導致BUG。也確保了環境的統一&#xff0c;不會出現在自己的電腦上能跑但是移植到別人電腦上就跑不通的情況。那么現在就開始先安裝Doc…

【每天一個知識點】非參聚類(Nonparametric Clustering)

ChatGPT 說&#xff1a;“非參聚類”&#xff08;Nonparametric Clustering&#xff09;是一類不預先設定聚類數目或數據分布形式的聚類方法。與傳統“參數聚類”&#xff08;如高斯混合模型&#xff09;不同&#xff0c;非參聚類在建模過程中不假設數據來自于已知分布數量的某…

人形機器人CMU-ASAP算法理解

一原文在第一階段&#xff0c;用重定位的人體運動數據在模擬中預訓練運動跟蹤策略。在第二階段&#xff0c;在現實世界中部署策略并收集現實世界數據來訓練一個增量&#xff08;殘差&#xff09;動作模型來補償動態不匹配。&#xff0c;ASAP 使用集成到模擬器中的增量動作模型對…

next.js刷新頁面時二級菜單展開狀態判斷

在 Next.js 中保持二級菜單刷新后展開狀態的解決方案 在 Next.js 應用中&#xff0c;當頁面刷新時保持二級菜單的展開狀態&#xff0c;可以通過以下幾種方法實現&#xff1a; 方法1&#xff1a;使用 URL 參數保存狀態&#xff08;推薦&#xff09; import { useRouter } from n…

網絡基礎DAY13-NAT技術

NAT技術internet接入方式&#xff1a;ADLS技術&#xff1a;能夠將不同設備的不同信號通過分離器進行打包之后再internet中傳輸&#xff0c;到另一端的分離器之后再進行分離。傳輸到不同的設備中去。常見光纖接入方式internet接入認證方式&#xff1a;PPPoE&#xff1a;先認證再…

HBuilderX中設置 DevEco Studio路徑,但是一直提示未安裝

前言&#xff1a; HBuilderX中設置 DevEco Studio路徑&#xff0c;但是一直提示未安裝。 報錯信息&#xff1a; 檢測到鴻蒙工具鏈&#xff0c;請在菜單“工具->設置->運行配置”中設置鴻蒙開發者工具路徑為 DevEco Studio 的安裝路徑&#xff0c;請參考 報錯原因…

什么是GNN?——聚合、更新與循環

在傳統的深度學習中&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;擅長處理網格結構數據&#xff08;如圖像&#xff09;&#xff0c;循環神經網絡&#xff08;RNN&#xff09;擅長處理序列數據&#xff08;如文本&#xff09;。但當數據以圖的形式存在時&#xff08;如…

深入解析 Django REST Framework 的 APIView 核心方法

在 Python 3 中&#xff0c;Django 的 APIView 類是 Django REST Framework&#xff08;DRF&#xff09;中用于構建 API 視圖的核心基類。它提供了一個靈活的框架來處理 HTTP 請求&#xff0c;并通過一系列方法支持認證、權限檢查和請求限制等功能。self.perform_authenticatio…

神經網絡——卷積層

目錄 卷積層介紹 Conv2d 卷積動畫演示 卷積代碼演示 綜合代碼案例 卷積層介紹 卷積層是卷積神經網絡&#xff08;CNN&#xff09;的核心組件&#xff0c;它通過卷積運算提取輸入數據的特征。 基本原理 卷積層通過卷積核&#xff08;過濾器&#xff09;在輸入數據&…

神經網絡——線性層

在機器學習中&#xff0c;線性層&#xff08;Linear Layer&#xff09; 是一種基礎的神經網絡組件&#xff0c;也稱為全連接層&#xff08;Fully Connected Layer&#xff09; 或密集層&#xff08;Dense Layer&#xff09;。 其嚴格的數學定義為&#xff1a;對輸入數據執行線…

大模型高效適配:軟提示調優 Prompt Tuning

The Power of Scale for Parameter-Efficient Prompt Tuning ruatishi 軟提示向量 具體是什么 《The Power of Scale for Parameter-Efficient Prompt Tuning》中增加的部分是“軟提示(soft prompts)”,這是一種針對特定下游任務,添加到輸入文本中的可調參數序列。它與傳統…

https正向代理 GoProxy

背景&#xff1a; 在安全隔離的內網環境中&#xff0c;部署于內網的應用如需調用公網第三方接口&#xff08;如支付、短信&#xff09;&#xff0c;可通過正向代理服務實現訪問。 GoProxy 下載&#xff1a; https://github.com/snail007/goproxy/releases 使用文檔&#xff…

Java IO流體系詳解:字節流、字符流與NIO/BIO對比及文件拷貝實踐

一、字節流與字符流&#xff1a;如何選擇&#xff1f; 1.1 核心區別特性字節流字符流處理單位字節&#xff08;8位&#xff09;字符&#xff08;16位Unicode&#xff09;適用場景二進制文件&#xff08;圖片/視頻&#xff09;文本文件&#xff08;TXT/CSV&#xff09;編碼處理需…

QT6 源,七章對話框與多窗體(5) 文件對話框 QFileDialog 篇二:源碼帶注釋

&#xff08;13&#xff09;本源代碼定義于頭文件 qfiledialog . h &#xff1a; #ifndef QFILEDIALOG_H #define QFILEDIALOG_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtCore/qdir.h> #include <QtCore/qstring.h> #include <QtCore/qurl.h…

關于Ajax的學習筆記

Ajax概念&#xff1a;是一門使用了js語言&#xff0c;可以使用于Javaweb&#xff0c;實現前端代碼和后端代碼連結的的一種異步同步&#xff08;不需要等待服務器相應&#xff0c;就能夠發送第二次請求&#xff09;的一種技術&#xff0c;它主要用于網頁內容的局部刷新&#xff…