X Tutup
#include #include using namespace std; //直接插入排序 void DirectorSort(vector& v) { //思路:将第n个元素插入到前n-1个有序序列中 //时间复杂度:O(N)~O(N^2) //稳定性:稳定 for(int i = 1;i < v.size();i++) { int j = i-1; int tmp = v[i]; while(j >= 0) { if(v[j] > tmp) { v[j+1] = v[j]; j--; } else { break; } } v[j+1] = tmp; } } //希尔排序 void HillSort(vector& v) { //思路:以gap为间隔进行直接插入排序 //时间复杂度:O(N^1.3)~O(N^2) //稳定性:不稳定 int gap = v.size(); while(gap > 1) { gap = gap/3+1;//gap以三倍缩小,为了保证最后一次GAP为1,加1 //直接插入排序 for(int i = 1;i < v.size();i++) { int j = i-gap; int tmp = v[i]; while(j >= 0) { if(v[j] > tmp) { v[j+gap] = v[j]; j -= gap; } else { break; } } v[j+gap] = tmp; } } } //选择排序 void SelectSort(vector& v) { //思路:从n个元素选出最大的和第n个元素交换位置 //时间复杂度:O(N^2) //稳定性:不稳定 for(int i = 0;i < v.size()-1;i++) { int maxIndex = 0; for(int j = 0;j < v.size()-i;j++) { if(v[j] > v[maxIndex]) { maxIndex = j; } } swap(v[maxIndex],v[v.size()-1-i]); } } //冒泡排序 void BubbleSort(vector& v) { //思路:两两比较,大的后移。一趟比较结束,最大的在最后 //世间复杂度:O(N^2) //稳定性:稳定 for(int i = v.size() - 1;i > 0;i--) { for(int j = 1;j <= i;j++) { if(v[j-1] > v[j]) { swap(v[j-1],v[j]); } } } } //快速排序 - 左右指针 int sort1(vector& v,int left,int right) { //思路:左边先走找大,右边再走找小,左右交换 //时间复杂度:O(NlogN),数据完全有序时时间复杂度为O(N^2),数据完全逆序时时间复杂度为O(N) //稳定性:不稳定 int tmp = right; while(left < right) { //左边先走找大 while(left < right && v[left] <= v[tmp]) { left++; } //右边再走找小 while(left < right && v[right] >= v[tmp]) { right--; } //左右交换 swap(v[left],v[right]); } //将tmp存在left位置 swap(v[left],v[tmp]); return left; } void QuickSort1(vector& v,int left,int right) { if(left >= right) return ; int index = sort1(v,left,right); QuickSort1(v,left,index-1); QuickSort1(v,index,right); } //快速排序 - 前后指针 int Sort2(vector& v,int p1,int p2) { //思路:cur < tmp,prev++,否则cur++ int cur = p1; int prev = cur-1; while(cur <= p2) { if(v[cur] <= v[p2] && ++prev != cur) { swap(v[cur],v[prev]); } cur++; } return prev; } void QuickSort2(vector& v,int p1,int p2) { if(p1 >= p2) return; int index = Sort2(v,p1,p2); QuickSort2(v,p1,index-1); QuickSort2(v,index,p2); } //快速排序 - 挖坑法 int sort3(vector& v,int left,int right) { //思路:左边先走找大,填到右边的坑,右边再走找小填到左边的坑 int tmp = v[right]; while(left < right) { while(left < right && v[left] <= tmp) left++; //左边的值填入右边的坑 v[right] = v[left]; while(left < right && v[right] >= tmp) right--; //右边的值填入左边的坑 v[left] = v[right]; } //tmp填入最后一个坑 v[left] = tmp; return left; } void QuickSort3(vector& v,int left,int right) { if(left >= right) return; int index = sort3(v,left,right); QuickSort3(v,left,index-1); QuickSort3(v,index,right); } //堆排 void AdjustDown(vector& v,int root,int end) { int child = root*2 + 1; int parent = root; while(child <= end) { if(child+1 <= end && v[child+1] > v[child]) child++; if(v[child] > v[parent]) { swap(v[child],v[parent]); //继续迭代 parent = child; child = parent*2 + 1; } else { break; } } } void HeapSort(vector& v) { //建大堆 for(int i = (v.size()-2)/2;i >= 0;i--) { AdjustDown(v,i,v.size()-1); } //堆排序 for(int i = 0;i < v.size()-1;i++) { swap(v[0],v[v.size()-1-i]); AdjustDown(v,0,v.size()-2-i); } } //归并排序 void Merge(vector& v,int begin1,int end1,int begin2,int end2) { vector tmp; int index = begin1; while(begin1 <= end1 && begin2 <= end2) { if(v[begin1] < v[begin2]) { tmp.push_back(v[begin1]); begin1++; } else { tmp.push_back(v[begin2]); begin2++; } } while(begin1 <= end1) { tmp.push_back(v[begin1]); begin1++; } while(begin2 <= end2) { tmp.push_back(v[begin2]); begin2++; } for(int i = 0;i < tmp.size();i++) { v[index] = tmp[i]; index++; } } void MergeSort(vector& v,int begin,int end) { if(begin >= end) return; int index = (begin+end)/2; MergeSort(v,begin,index); MergeSort(v,index+1,end); Merge(v,begin,index,index+1,end); } int main() { vector v(15); v = {2,5,8,7,9,3,4,6,0,12,43,35,76,25,7}; cout<<"待排序序列:"; for(auto e:v) { cout<
X Tutup