#include#include#include#includeusing namespace std;void print(int a[], int n, int i) {cout << i "> 日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频 國內最全IT社區平臺 聯系我們 | 收藏本站 首頁 php框架 框架設計 Yii Symfony CakePHP codeigniter ZendFramework ThinkPHP web前端 網絡優化 特效 jscript htmlcss jquery 程序人生 散文 隨筆 程序員工資吐槽 程序員人生規劃 程序員面試 php開源 php教程 destoon 綜合技術 ecshop Discuz 帝國CMS DedeCMS PHPCMS WordPress 數據庫 數據庫應用 FoxPro sybase Oracle Sqlserver MySql access 服務器 互聯網 招商加盟 工具 程序員求簽 程序員老黃歷 顏色選擇器 編程教程 您當前位置:首頁 > php開源 > php教程 > 數據結構之排序算法 數據結構之排序算法 來源:程序員人生 發布時間:2016-11-11 08:47:05 閱讀次數:2751次 #include#include#include#include#includeusing namespace std; void print(int a[], int n, int i) { cout << i << ":"; for (int j = 0; j<8; j++) { cout << a[j] << " "; } cout << endl; } void swap(int a, int b) { int temp; temp = a; a = b; b = temp; } /*插入排序: 將第1待排序序列第1個元素看作1個有序序列,把第2個元素到最后1個元素當做是未排序序列。 從頭到尾順次掃描未排序序列,將掃描到的每一個元素插入有序序列的適當位置。 如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的后面。 * 時間復雜度也為O(n^2), 比冒泡法和選擇排序的性能要更好1些 */ void InsertSort(int a[], int n) { for (int i = 1; i1; j--) { if(a[j] i; j--) { if (a[j] < a[j - 1]) swap(a[j], a[j - 1]); } } } /*快速排序 從數列中挑出1個元素,稱為 “基準”(pivot), 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任1邊)。在這個分區退出以后,該基準就處于數列的中間位置。這個稱為分區(partition)操作。 遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序。*/ void QuickSort(int a[], int n)//n為數組的長度 { int low=0,high=n⑴; int temp,temq; int pivot=a[low];//樞軸值 if(n >1 ) { while(low = pivot ) --high; a[low]= a[high];//比pivot小的都放在左側 while(low=1; div/=2) { for(int i=div; i=0; j-=div) swap(a[j],a[j-div]); } } } /*堆排序 首先,按堆的定義將數組R[0..n]調劑為堆(這個進程稱為創建初始堆),交換R[0]和R[n]; 然后,將R[0..n⑴]調劑為堆,交換R[0]和R[n⑴]; 如此反復,直到交換了R[0]和R[1]為止。 只不過直接選擇排序中,為了從R[1...n]當選擇最大記錄,需比較n⑴次,然后從R[1...n⑵]當選擇最大記錄需比較n⑵次。 事實上這n⑵次比較中有很多已在前面的n⑴次比較中已做過,而樹形選擇排序恰好利用樹形的特點保存了部份前面的比較結果, 因此可以減少比較次數。對n個關鍵字序列,最壞情況下每一個節點需比較log2(n)次,因此其最壞情況下時間復雜度為nlogn。 堆排序為不穩定排序,不合適記錄較少的排序。 */ void HeapAdjust(int a[],int i,int n) //調劑堆 { int lchild=2*i; //i的左孩子節點序號 int rchild=2*i+1; //i的右孩子節點序號 int max=i; //臨時變量 if(i<=n/2) //如果i不是葉節點就不用進行調劑 { if(lchild<=n&&a[lchild]>a[max]) { max=lchild; } if(rchild<=n&&a[rchild]>a[max]) { max=rchild; } if(max!=i) { swap(a[i],a[max]); HeapAdjust(a,max,n); //避免調劑以后以max為父節點的子樹不是堆 } } } void BuildHeap(int a[],int n) //建立堆 { int i; for(i=n/2;i>=1;i--) //非葉節點最大序號值為size/2 { HeapAdjust(a,i,n); } } void HeapSort(int a[],int n) //堆排序 { int i; BuildHeap(a,n); for(i=n;i>=1;i--) { //cout<= n⑴) right = n-b; else right = length; int* temp = new int[length+right]; int i=0, j=0; while(i<=length⑴ && j<=right⑴){ if(data[a+i] <= data[b+j]){ temp[i+j] = data[a+i];i++; } else{ temp[i+j] = data[b+j]; j++; } } if(j == right){//a中還有元素,且全都比b中的大,a[i]還未使用 memcpy(temp + i + j, data + a + i, (length - i) * sizeof(int)); } else if(i == length){ memcpy(temp + i + j, data + b + j, (right - j)*sizeof(int)); } memcpy(data+a, temp, (right + length) * sizeof(int)); delete [] temp; } void MergeSort(int* data, int n){ int step = 1; while(step < n){ for(int i=0; i<=n-step⑴; i+=2*step) Merge(data, i, i+step, step, n); //將i和i+step這兩個有序序列進行合并 //序列長度為step //當i以后的長度小于或等于step時,退出 step*=2;//在按某1步長歸并序列以后,步長加倍 } } /* 基數排序 可以對個位數、10位數、百位數也依照這類方法進行排序,最后就可以得到排序完成的序列。 */ int maxbit(int data[], int n) //輔助函數,求數據的最大位數 { int d = 1; //保存最大的位數 int p = 10; for(int i = 0; i < n; ++i) { while(data[i] >= p) { p *= 10; ++d; } } return d; } void radixsort(int data[], int n) //基數排序 { int d = maxbit(data, n); int *tmp = new int[n]; int *count = new int[10]; //計數器 int i, j, k; int radix = 1; for(i = 1; i <= d; i++) //進行d次排序 { for(j = 0; j < 10; j++) count[j] = 0; //每次分配前清空計數器 for(j = 0; j < n; j++) { k = (data[j] / radix) % 10; //統計每一個桶中的記錄數 count[k]++; } for(j = 1; j < 10; j++) count[j] = count[j - 1] + count[j]; //將tmp中的位置順次分配給每一個桶 for(j = n - 1; j >= 0; j--) //將所有桶中記錄順次搜集到tmp中 { k = (data[j] / radix) % 10; tmp[count[k] - 1] = data[j]; count[k]--; } for(j = 0; j < n; j++) //將臨時數組的內容復制到data中 data[j] = tmp[j]; radix = radix * 10; } delete[]tmp; delete[]count; } //主程序 int main() { int n; cin>>n; int k=n; int* a=new int[n]; while(k--){ cin>>a[n-k⑴]; } //int a[8] = { 3,1,5,7,2,4,9,6 }; InsertSort(a, 8); //BubbleSort(a, 8); //DirectSort(a, 8); //radixsort(a,8); //HeapSort(a,8); //ShellSort(a,8); //QuickSort(a,8); //MergeSort(a,8); print(a, 8, 8); } 生活不易,碼農辛苦 如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈 ------分隔線---------------------------- 上一篇 spring boot 學習--08---搭建ssmm-01 下一篇 到處都在說直播連麥技術,它們真的能連嗎? 分享到: ------分隔線---------------------------- 為碼而活 積分:4237 15粉絲 7關注 欄目熱點 如何正確理解PHP的錯誤信息 PHP自動捕捉頁面500錯誤示例 系統總結PHP開發語言中的精華和技巧 Codeforces Round #295 (Div. 1) B. Cubes (STL+類拓撲) 使用Maven_Jetty構建Struts2工程 Deferred shading技術簡介 PHP程序開發中容易犯的十大錯誤 php不同編碼下的字符串長度區分 程序員人生,我編程,我富裕,記住wfuyu網,php教程,php學習,php手冊,CMS模版制作 聲明:本站大部分內容是作者原創,少部分收集于互聯網供大家一起學習,原版權很多不明,如有侵權請聯系本站,謝謝! 粵ICP備14040726號-1?? 2015-2020 程序員人生 版權所有 主站蜘蛛池模板: 欧美在线视频网 | 国产精品一区二区在线播放 | 国产91在线播放 | 在线看一区二区 | 亚洲欧美激情精品一区二区 | 精品国产一区二区三区不卡蜜臂 | 精品视频在线观看一区二区三区 | 精品无码久久久久久国产 | 欧美黄色aa| 国产精品一区二区三区在线 | 亚洲+变态+欧美+另类+精品 | 久亚洲| 国产精品久久久久久久久久久久 | 天天摸天天操天天干 | 91精品国产日韩91久久久久久 | 成人国产综合 | 国产成人免费视频网站视频社区 | 91玖玖| 在线免费日韩 | 免费观看的av | 成人国产精品久久久 | 黄污污网站 | 亚洲成人福利在线 | 欧美精品一区二区三区蜜臀 | 91高清在线观看 | 麻豆av一区 | 午夜视频网 | 日韩精品久久久久久 | 国产精品性| 国产一区二区三区观看 | 精品国产一| 欧美精品一区二 | 成人精品久久久 | 黄网页在线观看 | 久久6视频| 精品国产黄 | 毛片毛片毛片毛片毛片毛片 | 欧美日韩18 | 天天综合久久 | 久久久青草婷婷精品综合日韩 | 欧美日本三级 |
上一篇 spring boot 學習--08---搭建ssmm-01
下一篇 到處都在說直播連麥技術,它們真的能連嗎?
程序員人生,我編程,我富裕,記住wfuyu網,php教程,php學習,php手冊,CMS模版制作
聲明:本站大部分內容是作者原創,少部分收集于互聯網供大家一起學習,原版權很多不明,如有侵權請聯系本站,謝謝!
粵ICP備14040726號-1?? 2015-2020 程序員人生 版權所有