日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

eq值 推荐算法_C++实现十种排序算法

發(fā)布時間:2025/3/12 c/c++ 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 eq值 推荐算法_C++实现十种排序算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

十種排序算法:

  • 選擇排序
  • 插入排序
  • 冒泡排序
  • 希爾排序
  • 快速排序的三種實現(xiàn)方法
  • 歸并排序
  • 堆排序(大頂堆)
  • 計數(shù)排序
  • 基數(shù)排序(待實現(xiàn))
  • 桶排序(待實現(xiàn))
#include <bits/stdc++.h> using namespace std; void MergeSubQ(int a[], int n, int p, int middle, int r); int Partition01(int a[], int p, int r); int Partition02(int a[], int p, int r); int* Partition03(int a[], int p, int r); void InitializeHeap(int a[], int n, int i);//選擇排序 O(n^2) void SelectSort(int a[], int n){for(int i=0; i<n-1; i++){int mmin=a[i];int index=i;for(int j=i+1; j<n; j++){if(a[j]<mmin){mmin=a[j];index=j;}}int temp = a[i];a[i] = a[index];a[index] = temp;} }//冒泡排序 O(n^2) void BubbleSort(int a[], int n){for(int i=0; i<n-1; i++)for(int j=0; j<n-i-1; j++){if(a[j]>a[j+1]){int temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}} //插入排序 O(n^2) void InsertSort(int a[], int n){for(int i=0; i<n; i++){int num = a[i];int index = i-1;while(index>-1 && num<a[index]){a[index+1] = a[index];index--;}a[index+1] = num;} }//希爾排序 O(n^1.3) void ShellSort(int a[], int n){for(int interval=n/2; interval>=1; interval/=2){for(int i=interval; i<n; i++){int num = a[i];int index = i-interval;while(index>-1 && num<a[index]){a[index+interval] = a[index];index-=interval;}a[index+interval] = num;}} }//歸并排序 void MergeSort(int a[], int n, int p, int r){if(p<r){int middle = p+((r-p)>>1);//遞歸求解子問題MergeSort(a, n, p, middle);MergeSort(a, n, middle+1, r);//合并MergeSubQ(a, n, p, middle, r);} } void MergeSubQ(int a[], int n, int p, int middle, int r){int help[n];//輔助數(shù)組for(int i=0; i<n; i++)help[i] = a[i];int left = p;//左指針int right = middle+1;//右指針int index=p;//當前要放入的位置while(left<=middle && right<=r){if(help[left]<=help[right]){ //左指針指向的元素較小,插入到a中a[index++] = help[left];left++;}if(help[left]>help[right]){ //右指針指向的元素較小,插入到a中a[index++] = help[right];right++;}}while(left<=middle){ //左部分還有剩余,直接插入a的末尾a[index++]=help[left];left++;} } //快速排序 void QuickSort(int a[], int p, int r){if(p<r){//找到主元應(yīng)在的位置int* b = Partition03(a, p, r);//遞歸求解主元的左部分和右部分QuickSort(a, p, b[0]-1);QuickSort(a, b[1]+1, r);} } int Partition01(int a[], int p, int r){ //單向掃描法int point = a[p]; //主元int scan = p+1; //掃描指針,指向主元后int bigger = r; //指向末尾while(scan<bigger+1){if(a[scan]>point){ //掃描到了比主元大的元素int temp = a[scan]; //與bigger指向的后面的元素進行交換a[scan] = a[bigger];a[bigger] = temp;bigger--;}else //小于等于主元情況scan++;}a[p] = a[bigger]; //將主元放到正確位置a[bigger] = point;return bigger; } int Partition02(int a[], int p, int r){ //雙指針int point = a[p];int left = p+1; //從左掃描int right = r; //從右掃描while(left<=right){while(left<=r && a[left]<point){left++;}while(right>=p+1 && a[right]>point){right--;}if(left<=right){int temp = a[left];a[left] = a[right];a[right] = temp;}}a[p] = a[right];a[right] = point;return right; } int* Partition03(int a[], int p, int r){ //重復(fù)元素過多時int point = a[p];int scan = p+1;int eq = p+1; //找重復(fù)int bigger = r;int flag=false;while(scan<=bigger){if(a[scan]<point){if(flag){int temp = a[scan];a[scan] = a[eq];a[eq] = temp;eq++;}scan++;}else if(a[scan]==point){ //相當時,將eq指向第一個相等的元素if(!flag){eq = scan;flag=true;}scan++;}else{int temp = a[scan];a[scan] = a[bigger];a[bigger] = temp;bigger--;}}if(!flag)eq=bigger;a[p] = a[bigger]; //bigger最后指向的是主元的位置a[bigger] = point;int b[2] = {eq, bigger}; //返回兩個值return b; } //堆排序 void HeapSort(int a[], int n){//初始化堆for(int x=n/2; x>=0; x--)InitializeHeap(a, n, x);//進行排序for(int x=n-1; x>=0; x--){int temp = a[0];a[0] = a[x];a[x] = temp;InitializeHeap(a, x, 0);}} void InitializeHeap(int a[], int n, int i){int left = 2*i+1;int right = 2*i+2;int maxIndex = left;if(left>=n)return ;if(right>=n){maxIndex = left;}else{if(a[right]>a[left])maxIndex=right;}if(a[i]>=a[maxIndex])return ;int temp = a[i];a[i] = a[maxIndex];a[maxIndex] = temp;InitializeHeap(a, n, maxIndex); } //基數(shù)排序 void BaseSort(int a[], int n){}//計數(shù)排序 void CountSort(int a[], int n){int mmax = a[0];for(int i=1; i<n; i++){ //找出數(shù)組中的最大值if(a[i]>mmax)mmax = a[i];}int help[mmax+1];memset(help, 0, sizeof(help));for(int i=0; i<n; i++){ //計數(shù)help[a[i]]++;}int index = 0;for(int i=1; i<mmax+1; i++){ //根據(jù)數(shù)的個數(shù)排序while(help[i]>0){a[index++] = i;help[i]--;}} }//桶排序int main(){int a[10];srand((int)time(0));for(int i=0; i<10; i++)a[i] = rand() % 100;SelectSort(a, 10);BubbleSort(a, 10);InsertSort(a, 10);ShellSort(a, 10);MergeSort(a, 10, 0, 9);QuickSort(a, 0, 9);HeapSort(a, 10);CountSort(a, 10);for(int i=0; i<10; i++)cout<<a[i]<<" ";return 0; }

總結(jié)

以上是生活随笔為你收集整理的eq值 推荐算法_C++实现十种排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。