排序算法实现

来源:互联网 发布:淘宝女装级别最高 编辑:程序博客网 时间:2024/05/16 05:12

//version 1.03#include<iostream>#include<cstring>#include<list>using namespace std;void swap(int &a, int &b){int temp = a;a = b;b =temp;}template <typename T>T myMax(T a, T b){return a >= b ? a : b;}///////////////////////////////// bubble sortvoid BubbleSort(int a[], int n){cout << "BubbleSort" << endl;for(int i =0; i < n; ++i){for(int j = n-1; j > i; --j){if(a[j] < a[j-1])swap(a[j], a[j-1]);}}for(int i=0; i<n; ++i)cout << a[i] << " ";cout << endl;}/////////////////////////////////////////     insert sortvoid InsertSort(int a[], int n){cout << "InsertSort" << endl;for(int i=0; i<n-1; ++i){for(int j=i+1; j>0; --j){if(a[j] < a[j-1])swap(a[j], a[j-1]);}}for(int i=0; i<n; ++i)cout << a[i] << " ";cout << endl;}///////////////////////////////////////// quick sortvoid quickSort(int a[], int n){//cout << "quickSort" << endl;if(n <= 1) return;int first = 0;int last  = n - 1;int key = a[0];while(first < last){while(first < last && a[last] >= key) --last;if(first < last)a[first] = a[last];while(first < last && a[first] < key) ++first;if(first < last)a[last] = a[first];}a[first] = key;quickSort(a, first);quickSort(a+first+1, n-first-1);}////////////////////////////////////////   select sortvoid selectSort(int a[], int n){cout << "selectSort" << endl;int minIdx = 0;for(int i = 0; i < n-1 ; ++i){minIdx = i;for(int j = i+1; j < n; ++j)if(a[j] < a[minIdx])minIdx = j;if(minIdx != i)swap(a[i], a[minIdx]);}}///////////////////////////////////////// merge sortvoid mergeArray(int a[], int first, int mid, int last, int temp[]){int m = mid, n = last;int i = first, j = mid + 1;int k = first;while(i <= m && j <= n){if(a[j] < a[i]){temp[k++] = a[j++];}else{temp[k++] = a[i++];}}while(i <= m){temp[k++] = a[i++];}while(j <= n){temp[k++] = a[j++];}while(first <= last){a[first] = temp[first];first++;}}void mergeSortImp(int a[], int start , int end, int *p){if(start < end){    int mid = (start + end) / 2;mergeSortImp(a, start, mid, p);mergeSortImp(a, mid+1, end, p);mergeArray(a, start, mid, end, p);}}void mergeSort(int a[], int n){cout << "mergeSort" << endl;int *p = new int[n];int start = 0;int end   = n - 1;mergeSortImp(a, start, end , p);    memcpy(a, p, sizeof(a[0]) * n);delete[] p;}///////////////////////////////////// shell sortvoid shellSort(int a[], int n){cout << "shellSort" << endl;int gap , i, j;for(gap = n/2; gap >= 1; gap /= 2){    for(i=gap; i<n; ++i)    for(j = i-gap; j>=0 && a[j] >a[j+gap]; j-=gap)    swap(a[j], a[j+gap]);}}//////////////////////////////////////////////////heap sort//http://blog.csdn.net/shuilan0066/article/details/8659235template <class T>void AdjustHeapNode(T a[], int i, int n){if(n==1 || i>(n-2)/2) return;int iLeft  = 2 * i + 1;int iRight = 2 * i + 2;if(iRight <= n-1){if(a[i] > a[iLeft] && a[i] > a[iRight]) return;if(a[iLeft] >= a[iRight]){swap(a[iLeft], a[i]);AdjustHeapNode(a, iLeft, n);}else{swap(a[iRight], a[i]);AdjustHeapNode(a, iRight, n);}}else{if(a[iLeft] < a[i]) return;swap(a[iLeft], a[i]);AdjustHeapNode(a, iLeft, n);}}template <typename T>void CreateHeap(T a[], int n){int iFirst = (n -1) / 2;for(; iFirst >= 0; --iFirst){AdjustHeapNode(a, iFirst, n);}}template <typename T>void HeapSort(T a[], int n){CreateHeap(a, n);for(int i = 1; i <= n-1; ++i){swap(a[0], a[n-i]);AdjustHeapNode(a, 0, n-i);}}//end/////////////////////////////bucket sortstruct bucket{int *node;int count;bucket(){node  = NULL;count = 0;}};int GetBucketIndex(int number){return number / 10;}void BucketSort(int a[], int n){cout << "BucketSort !!!" << endl;int min = 10000, max = -100000;for(int i = 0; i < n; ++i){if(a[i] > max) max = a[i];if(a[i] < min) min = a[i];}int bucket_count = (max - min) / 10 + 1;bucket *pBucket[bucket_count];for(int i = 0; i < bucket_count; ++i){pBucket[i] = new bucket;pBucket[i]->node = new int[10];}for(int i = 0; i < n; ++i){int idx = GetBucketIndex(a[i] - min);int &insert_idx = pBucket[idx]->count;pBucket[idx]->node[insert_idx++] = a[i];}int pos = 0;for(int i = 0; i < bucket_count; ++i){if(pBucket[i]->count > 0)quickSort(pBucket[i]->node, pBucket[i]->count);for(int j = 0; j < pBucket[i]->count; j++)a[pos++] = pBucket[i]->node[j];}for(int i = 0; i < bucket_count; ++i){delete[] pBucket[i]->node;delete   pBucket[i];}}//end bucket sort//cocktail_sortvoid CockTailSort(int a[], int n){cout << "CockTailSort!!!" << endl;int start = 0, end = n - 1;while(start < end){for(int i = start ; i < end; ++i){if(a[i] > a[i+1])swap(a[i], a[i+1]);}--end;for(int i = end; i > start; --i){if(a[i] < a[i-1])swap(a[i], a[i-1]);}++start;}}//end cocktail sort//count sortvoid CountSort(int a[], int n){cout << "CountSort!!!" << endl;int max = -10000;int temp[n];for(int i = 0; i < n; ++i){if(a[i] > max) max = a[i];}int *b = new int[max + 1];for(int i = 0; i < max + 1; ++i)b[i] = 0;for(int i = 0; i < n; ++i){b[a[i]]++;}for(int i = 1; i < n; ++i){b[i] += b[i-1];}for(int i = 0 ; i < n; ++i){int pos   = b[a[i]] - 1;temp[pos] = a[i];b[a[i]]++;}memcpy(a, temp, sizeof(*a) * n);delete[] b;}//end count sort/////////////////////////////////////////radix sortint GetNumByPos(int in, int pos){int temp = 1;for(int i = 0; i < pos; ++i){temp *= 10;}return in / temp % 10;}#define keyNum 10void RadixSort(int a[], int n, int d){int *pArr[10];for(int i = 0; i < 10; ++i){pArr[i] = new int[10];pArr[i][0] = 0;}for(int i = 0; i < d; ++i){for(int j = 0; j < n; ++j){int idx = GetNumByPos(a[j], i);int pos = pArr[idx][0] + 1;pArr[idx][pos] = a[j];++pArr[idx][0];}int pos_t = 0;for(int k = 0; k < 10; ++k){for(int m = 0; m < pArr[k][0]; ++m){a[pos_t++] = pArr[k][m+1];}pArr[k][0] = 0;}}for(int i = 0; i < 10; ++i){delete[] pArr[i];}}//end radix sort////////////////////////////////////   gnome sortvoid GnomeSort(int a[], int n){cout << "Gnome Sort" << endl;int i = 0;while(i < n){if(i == 0 || a[i] >= a[i-1])++i;else{swap(a[i], a[i-1]);--i;}}}//end gonme sort///////////////////////////////////// odd_even sortvoid OddEvenSort(int a[], int n){cout << "Odd_Even Sort!" << endl;bool sorted = false;while(!sorted){sorted = true;for(int i = 1; i < n-1; i += 2){if(a[i+1] < a[i]){swap(a[i+1], a[i]);sorted = false;}}for(int i = 0; i < n-1; i += 2){if(a[i+1] < a[i]){swap(a[i+1], a[i]);sorted = false;}}}}// end odd_even sort///////////////////////////////////////////  comb sortvoid CombSort(int a[], int n){cout << "Comb Sort!" << endl;double temp = 1.3;int step    = static_cast<int>(n / temp);while(step > 0){for(int i = 0; i + step < n; ++i){if(a[i] > a[i + step])swap(a[i], a[i + step]);}step = static_cast<int>(step / temp);}}//  end comb sort//////////////////////////////////////////// strand sortvoid MergeList(list<int> &src, list<int> &dest){list<int>::iterator iter1 = src.begin();list<int>::iterator iter2 = dest.begin();list<int> temp;while(iter1 != src.end() && iter2 != dest.end()){if(*iter1 > *iter2){temp.push_back(*iter2);++iter2;}else{temp.push_back(*iter1);++iter1;}}while(iter1 != src.end()){temp.push_back(*iter1);++iter1;}while(iter2 != dest.end()){temp.push_back(*iter2);++iter2;}src.clear();dest.clear();for(iter2 = temp.begin(); iter2 != temp.end(); ++iter2)dest.push_back(*iter2);temp.clear();}void StrandSort(int a[], int n){list<int> data(a, a + n);list<int> result;list<int> temp;list<int>::iterator iter;list<int>::iterator iter2;while(!data.empty()){int key = data.front();temp.push_back(key);data.pop_front();for(iter = data.begin(); iter != data.end();){if(*iter > key){temp.push_back(*iter);key = *iter;iter2 = iter;++iter;data.erase(iter2);}else{++iter;}}MergeList(temp, result);}int i = 0;for(iter = result.begin();iter != result.end(); ++iter,++i)a[i] = *iter;}//int main(){//int a[] ={1, 6, 5, 8, 0, 2, 4, 3, 7, 9 };//int a[] ={2,1};int a[] ={78, 17, 39, 26, 72, 94, 21, 12, 23, 91};//BubbleSort(a, 10);//InsertSort(a, 10);//quickSort(a, 10);//selectSort(a, 10);//mergeSort(a, 10);//shellSort(a, 10);//HeapSort(a, 10);    //BucketSort(a, 10);//CockTailSort(a, 10);//CountSort(a, 10);//RadixSort(a, 10, 2);//GnomeSort(a, 10);//OddEvenSort(a, 10);//CombSort(a, 10);StrandSort(a, 10);for(int i=0; i<10; ++i)cout << a[i] << " ";cout << endl;return 0;}

好久没有写博客了,在网易云笔记上写了不少,但是比较凌乱,也懒得整理。前一段时间有空,实现了一部分排序算法,贴出来吧,欢迎大家批评指正。

0 0