




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、常見經典排序核心算法(學習筆記)1.希爾排序2.二分插入法3.直接插入法4.帶哨兵的直接排序法5.冒泡排序6.選擇排序7.快速排序8.堆排序一.希爾(Shell)排序法(又稱宿小增量排序,是1959年由D.L.Shell提出來的) /* Shell 排序法 */#include <stdio.h> void sort(int v,int n) int gap,i,j,temp; for(gap=n/2;gap>0;gap /= 2) /* 設置排序的步長,步長gap每次減半,直到減到1 */ for(i=gap;i<n;i+) /* 定位到每一個元素 */ for(j=
2、i-gap;(j >= 0) && (vj > vj+gap);j -= gap ) /* 比較相距gap遠的兩個元素的大小,根據排序方向決定如何調換 */ temp=vj; vj=vj+gap; vj+gap=temp; 二.二分插入法 /* 二分插入法 */void HalfInsertSort(int a, int len) int i, j,temp; int low, high, mid; for (i=1; i<len; i+) temp = ai;/* 保存但前元素 */ low = 0; high = i-1; while (low <=
3、 high) /* 在alow.high中折半查找有序插入的位置 */ mid = (low + high) / 2; /* 找到中間元素 */ if (amid > temp) /* 如果中間元素比但前元素大,當前元素要插入到中間元素的左側 */ high = mid-1; else /* 如果中間元素比當前元素小,但前元素要插入到中間元素的右側 */ low = mid+1; /* 找到當前元素的位置,在low和high之間 */ for (j=i-1; j>high; j-)/* 元素后移 */ aj+1 = aj; ahigh+1 = temp; /* 插入 */ 三.直接
4、插入法 /*直接插入法*/ void InsertionSort(int input,int len) int i,j,temp; for (i = 1; i < len; i+) temp = inputi; /* 操作當前元素,先保存在其它變量中 */ for (j = i - 1;j>-1&&inputj > temp ; j-) /* 從當前元素的上一個元素開始查找合適的位置 */ inputj + 1 = inputj; /* 一邊找一邊移動元素 */ inputj = temp; 四.帶哨兵的直接排序法 /* * 帶哨兵的直接插入排序,數組的第一個
5、元素不用于存儲有效數據 * 將input0作為哨兵,可以避免判定inputj中,數組是否越界 * 因為在j-的過程中,當j減小到0時,變成了input0與input0 * 自身進行比較,很明顯這個時候說明位置i之前的數字都比inputi小 * 位置i上的數字不需要移動,直接進入下一輪的插入比較。 * */void InsertionSortWithPiquet(int input,int len) int i,j; for (i = 2; i < len; i+) /* 保證數組input第一元素的存儲數據無效,從第二個數據開始與它前面的元素比較 */ input0 = inputi;
6、for (j = i - 1; inputj > input0 ; j-) inputj + 1 = inputj; inputj = input0; /* inputj一直都是排序的元素中最大的那一個 */ 五.冒泡法 /* 冒泡排序法 */void Bublesort(int a,int n) int i,j,k; for(j=0;j<n;j+) /* 氣泡法要排序n次*/ for(i=0;i<n-j;i+) /* 值比較大的元素沉下去后,只把剩下的元素中的最大值再沉下去就可以啦 */ if(ai>ai+1) /* 把值比較大的元素沉到底 */ k=ai; ai=a
7、i+1; ai+1=k; 六.選擇排序法 /* 算法原理:首先以一個元素為基準,從一個方向開始掃描, * 比如從左至右掃描,以A0為基準。接下來從A0.A9 * 中找出最小的元素,將其與A0交換。然后將基準位置右 * 移一位,重復上面的動作,比如,以A1為基準,找出 * A1A9中最小的,將其與A1交換。一直進行到基準位 * 置移到數組最后一個元素時排序結束(此時基準左邊所有元素 * 均遞增有序,而基準為最后一個元素,故完成排序)。 */void Selectsort(int A,int n) int i,j,min,temp; for(i=0;i<n;i+) min=i; for(j=
8、i+1;j<=n;j+) /* 從j往前的數據都是排好的,所以從j開始往下找剩下的元素中最小的 */ if(Amin>Aj) /* 把剩下元素中最小的那個放到Ai中 */ temp=Ai; Ai=Aj; Aj=temp; 七.快速排序 /* 快速排序(quick sort)。在這種方法中, * n 個元素被分成三段(組):左段left, * 右段right和中段middle。中段 * 僅包含一個元素。左段中各元素都小于等 * 于中段元素,右段中各元素都大于等于中 * 段元素。因此left和right中的元 * 素可以獨立排序,并且不必對left和 * right的排序結果進行合并。
9、 * 使用快速排序方法對a0:n-1排序 * 從a0:n-1中選擇一個元素作為middle, * 該元素為支點把余下的元素分割為兩段left * 和right,使得left中的元素都小于 * 等于支點,而right 中的元素都大于等于支點 * 遞歸地使用快速排序方法對left 進行排序 * 遞歸地使用快速排序方法對right 進行排序 * 所得結果為left+middle+right */ void Quick_sort(int data,int low,int high) int mid; if(low<high) mid=Partition(data,low,high); Quick
10、_sort(data,low,mid-1); /* 遞歸調用 */ Quick_sort(data,mid+1,high); /* 要注意看清楚下面的數據之間是如何替換的, * 首先選一個中間值,就是第一個元素datalow, * 然后從該元素的最右側開始找到比它小的元素,把 * 該元素復制到它中間值原來的位置(datalow=datahigh), * 然后從該元素的最左側開始找到比它大的元素,把 * 該元素復制到上邊剛剛找到的那個元素的位置(datahigh=datalow), * 最后將這個剛空出來的位置裝入中間值(datalow=data0), * 這樣一來比mid大的都會跑到mid的右
11、側,小于mid的會在左側, * 最后一行,返回的low是中間元素的位置,左右分別遞歸就可以排好序了。 */int Partition(int data,int low,int high) int mid; data0=datalow; mid=datalow; while(low < high) while(low < high) && (datahigh >= mid) -high; datalow=datahigh; /* 從high的位置開始往low的方向找,找到比datalow小的元素,存到datalow中 */ while(low < high
12、) && (datalow < mid) /* 新得到的datalow肯定小于原來的datalow即mid */ +low; datahigh=datalow; /* 從low的位置開始往high的方向找,找到比datahigh大的元素,存在datahigh中 */ datalow=data0; /* 把low的新位置存上原來的datalow的數據 */ return low; /* 遞歸時,把它做為右側元素的low */ 八.堆排序 /* * 堆的定義 n 個元素的序列 k1,k2,.,kn當且僅當滿足下列關系時, * 稱為堆: * ki<=k2i ki<=
13、k2i+1 (i=1,2,.,n/2) * 或 * ki>=k2i ki>=k2i+1 (i=1,2,.,n/2) * 堆排序思路: * 建立在樹形選擇排序基礎上; * 將待排序列建成堆(初始堆生成)后,序列的第一個元素(堆頂元素)就一定是序列中的最大元素; * 將其與序列的最后一個元素交換,將序列長度減一; * 再將序列建成堆(堆調整)后,堆頂元素仍是序列中的最大元素,再次將其與序列最后一個元素交換并縮短序列長度; * 反復此過程,直至序列長度為一,所得序列即為排序后結果。 */void HeapAdjust(int data,int s,int m) /* 排列成堆的形式 */
14、 int j,rc; rc=datas; /* 保存處理元素 */ for(j=2*s;j<=m;j*=2) /* 處理父親元素 */ if(j<m && dataj<dataj+1) +j; /* 取較大的孩子節點 */ if(rc>dataj) break; datas=dataj; /* 父節點比較大的孩子節點大則互換 ,保證父節點比所有子節點都大(父節點存儲在前面)*/ s=j; datas=rc; /* 相當于dataj=rc */ void Heap_sort(int data,int long_n) /* 堆排序函數 */ int i,temp; for(i=long_n/2;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創業扶持政策適用領域試題及答案
- 2025年創業扶持政策與地區經濟的互動性試題及答案
- 中國滑石礦行業市場發展現狀及前景趨勢與投資分析研究報告2025-2028版
- 中國滌棉漂白踏花被行業市場發展前景及發展趨勢與投資戰略研究報告2025-2028版
- 土木工程師考試全景分析試題及答案
- 中國標準件行業發展分析及投資風險預測分析報告2025-2028版
- 創業者如何應對政策改變帶來的風險試題及答案
- 遠程醫療服務在分級診療中實現跨區域醫療資源共享的報告
- 醫古文Z期末試題及答案
- 休閑農業與鄉村旅游融合發展政策導向與市場前景分析報告
- DB37-T 2673-2019 醫療機構能源消耗定額標準-(高清版)
- 2023屆畢業論文格式要求(福建農林大學)
- 外墻保溫脫落維修方案范文通用5篇
- 玻璃工藝學:第8章 玻璃的熔制
- 黃元御“下氣湯十二方”治諸多內科雜病疑難重癥
- 第3章品牌識別及品牌符號
- 肝硬化-本科授課課件
- 城鎮供熱管網工程施工組織設計
- 《蔣勛眼中的宋詞》閱讀練習及答案
- 全回轉鉆機在國內的發展與應用(課堂PPT)
- 自制A4紙田字格模板(可直接打印版).xls2014.9.14
評論
0/150
提交評論