好久没更博了,大三应该有更多的时间写东西。谢谢大家的支持!
//Sort_H.h #include <iostream> #include <vector> #include <algorithm> using namespace std; /*宏定义*/ #ifndef Sort_H #define Sort_H /* 为了方便后面的桶排序,我们约定所要排列的数均不超过1000 */ class Sort { public: Sort(int s); //构造函数,初始化排序的数组 int Size(); void Insertion_sort(); //插入排序 void Selection_sort(); //选择排序 void Merge(int p,int q,int r); //归并函数中的合并函数 void merge_sort(int p,int r); //归并排序 void Merge_sort(); //合并 void Bubble_sort(); //冒泡排序 void Heap_sort(); //堆排序 vector<int> Build_MAX_Heap(vector<int>& qq); //建立最大堆 void MAX_Heapify(vector<int>& qq,int index); //维护最大堆 int heap_size; //堆大小 void Quick_sort(); //快速排序 void quickSort(vector<int> &list,int first,int last); //快速排序中的划分 int partition(vector<int> &list,int first,int last); //划分数组list[first...last] void Bucket_Sort(vector<int> &list); //桶排序 void Bogo_Sort(); void bogo_sort(vector<int> &list); /* Bogo排序(bogo-sort)是个既不实用又原始的排序算法,其原理等同将一堆卡片抛起,落在桌上后检查卡片是否已整齐排列好,若非就再抛一次。 其名字源自Quantum bogodynamics,又称bozo sort、blort sort或猴子排序(参见无限猴子定理)。 无限猴子定理:让一只猴子在打字机上随机地按键,当按键时间达到无穷时,几乎必然能够打出任何给定的文字,比如莎士比亚的全套著作。 */ void Shuffle(vector<int> &list); bool Inorder(vector<int> list); private: vector<vector<int>> Bucket; vector<int> A; int size; }; #endif
//Sort.cpp #include "Sort_H.h" #include <iostream> #include <vector> #include <algorithm> #include <ctime> #include <cstdlib> using namespace std; const int MAX = 60000; const int NUM = 3; Sort::Sort(int s) { size = s; cout << "请初始化数组里各个元素:" << endl; A.resize(s); int i; for(i = 0;i < size;i++) { cin >> A[i] ; } cout << "未排序前数组类各个元素分别为:" << endl; for(i = 0;i < size;i++) cout << A[i] << " "; cout << endl; } int Sort::Size() { return size; } void Sort::Insertion_sort() { int key; int i,j; for(i = 1;i < size;i++) { key = A[i]; j = i - 1; while(j >= 0 && key < A[j]) { A[j+1] = A[j]; j--; } A[j+1] = key; } cout << "将插入排序处理后序列为:" << endl; for(i = 0;i < size;i++) cout << A[i] << " " ; cout << endl; } //冒泡排序 void Sort::Bubble_sort() { int i,j; for(i = 0;i < size;i++) { for(j = size - 1;j > i ;j--) { if(A[j] < A[j-1]) swap(A[j],A[j-1]); } } cout << "将冒泡排序处理后序列为:" << endl; for(i = 0;i < size;i++) cout << A[i] << " " ; cout << endl; } //选择排序 void Sort::Selection_sort() { int i,j; for(i = 0;i < size;i++) { int index = i; for(j = i;j < size;j++) { if(A[index] > A[j]) { index = j; } } swap(A[i],A[index]); } cout << "将选择排序处理后序列为:" << endl; for(i = 0;i < size;i++) cout << A[i] << " " ; cout << endl; } //合并过程 //起于p,终于r,分割点为q void Sort::Merge(int p,int q,int r) { int i,j,k; int n1 = q - p + 1; int n2 = r - q; vector<int> L; vector<int> R; L.resize(n1+1); R.resize(n2+1); for(i = 0;i < n1;i++) { L[i] = A[p+i]; } for(i = 0;i < n2;i++) { R[i] = A[q+i+1]; } //哨兵值 L[n1] = MAX; R[n2] = MAX; i = j = 0; for(k = p;k <= r;k++) { if(L[i] <= R[j]) { A[k] = L[i]; i++; } else { A[k] = R[j]; j++; } } } void Sort::merge_sort(int p,int r) { if(p < r) { int q = (p + r)/2; merge_sort(p,q); merge_sort(q + 1,r); Merge(p,q,r); } } //归并排序 void Sort::Merge_sort() { merge_sort(0,Size() - 1); cout << "将归并排序处理后序列为:" << endl; for(int i = 0;i < size;i++) cout << A[i] << " " ; cout << endl; } void Sort::Heap_sort() { vector<int> result; result = Build_MAX_Heap(A); heap_size = A.size(); A.clear(); int i; for(i = result.size();i >= 2;i--) { swap(result[0],result[i-1]); A.push_back(result[i-1]); result.pop_back(); heap_size--; MAX_Heapify(result,0); } A.push_back(result[0]); cout << "将堆排序处理后序列为:" << endl; for(int i = 0;i < size;i++) cout << A[i] << " " ; cout << endl; } vector<int> Sort::Build_MAX_Heap(vector<int> & qq) { vector<int> result; int n = qq.size(); result = qq; int i; for(i = n/2;i >= 1;i--) { MAX_Heapify(result,i-1); } return result; } void Sort::MAX_Heapify(vector<int>& qq,int index) //维护最大堆 { int left = 2*index + 1; int right = 2*index + 2; int largest ; if(index > qq.size()/2 -1) ; if(left < qq.size() && qq[left] < qq[index]) largest = left; else largest = index; if(right < qq.size() && qq[right] < qq[largest]) largest = right; if(largest != index) { swap(qq[index],qq[largest]); MAX_Heapify(qq,largest); } } int Sort::partition(vector<int> &list,int first,int last) { int pivot = list[first]; int low = first + 1; int high = last; while(high > low) { //从左端向前 while(low <= high && list[low] <= pivot) low++; //从右端向后 while(low <= high && list[high] > pivot) high--; //交换表中两个元素 if(high > low) { int temp = list[high]; list[high] = list[low]; list[low] = temp; } } while(high > first && list[high] >= pivot) high--; //交换pivot和list[high] if(pivot > list[high]) { list[first] = list[high]; list[high] = pivot; return high; } else return first; } void Sort::quickSort(vector<int> &list,int first,int last) { if(last > first) { int pivotIndex = partition(list,first,last); quickSort(list,first,pivotIndex - 1); quickSort(list,pivotIndex + 1,last); } } void Sort::Quick_sort() { quickSort(A,0,A.size()-1); cout << "将快速排序处理后序列为:" << endl; for(int i = 0;i < size;i++) cout << A[i] << " " ; cout << endl; } void Sort::Bucket_Sort(vector<int> &list) { Bucket.resize(10); int i,j,k; for(i = 0;i < list.size();i++) { Bucket[list[i] % 100].push_back(list[i]); } j = 0; for(i = 0;i < 10;i++) { if(!Bucket[i].empty()) { for(k = 0;k < Bucket[i].size();k++) list[j++] = Bucket[i][k]; } } for(i = 0;i < 10;i++) Bucket[i].clear(); for(i = 0;i < list.size();i++) { Bucket[list[i] / 10 % 10].push_back(list[i]); } j = 0; for(i = 0;i < 10;i++) { if(!Bucket[i].empty()) { for(k = 0;k < Bucket[i].size();k++) list[j++] = Bucket[i][k]; } } for(i = 0;i < 10;i++) Bucket[i].clear(); for(i = 0;i < list.size();i++) { Bucket[list[i] / 100].push_back(list[i]); } j = 0; for(i = 0;i < 10;i++) { if(!Bucket[i].empty()) { for(k = 0;k < Bucket[i].size();k++) list[j++] = Bucket[i][k]; } } cout << "将桶排序处理后序列为:" << endl; for(int i = 0;i < size;i++) cout << list[i] << " " ; cout << endl; } void Sort::Bogo_Sort() { bogo_sort(A); } void Sort::bogo_sort(vector<int> &list) { while(!Inorder(list)) Shuffle(list); cout << "将猴子排序处理后序列为:" << endl; for(int i = 0;i < size;i++) cout << list[i] << " " ; cout << endl; } void Sort::Shuffle(vector<int> &list) { int i; int length = list.size(); srand(time(0)); for(i = 0;i < list.size();i++) { int num = rand() % length; int temp = list[num]; list[num] = list[i]; list[i] = temp; } } bool Sort::Inorder(vector<int> list) { for (int i = 0; i < list.size() - 1; i++) { if (list[i] > list[i+1]) return false; } return true; }
//test.cpp #include <iostream> #include <vector> #include "Sort_H.h" using namespace std; int main() { Sort s(6); //s.Insertion_sort(); //s.Bubble_sort(); //s.Selection_sort(); //s.Merge_sort(); //s.Heap_sort(); //s.Quick_sort(); s.Bogo_Sort(); return 0; }