生活随笔
收集整理的這篇文章主要介紹了
eq值 推荐算法_C++实现十种排序算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
十種排序算法:
- 選擇排序
- 插入排序
- 冒泡排序
- 希爾排序
- 快速排序的三種實(shí)現(xiàn)方法
- 歸并排序
- 堆排序(大頂堆)
- 計數(shù)排序
- 基數(shù)排序(待實(shí)現(xiàn))
- 桶排序(待實(shí)現(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;//當(dāng)前要放入的位置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指向的后面的元素進(jìn)行交換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){ //相當(dāng)時,將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);//進(jìn)行排序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)容還不錯,歡迎將生活随笔推薦給好友。