下午就要考数据结构了呀有点慌....所以看看排序抱抱佛脚..于是...写了堆排序就停不下来了呢...
所以就把上课老师讲的排序都写了一遍..交题都过了可是复杂度可能会有些小问题..
//-------------------------堆排序------------------------// //时间复杂度 平均 O(nlogn) 最坏 O(nlogn) //空间复杂度 O(1) #include <bits/stdc++.h> using namespace std; int a[1000006],n; void PercDown(int a[],int i,int n) //O(logn) { if(2 * i + 1 >= n) return ; else if(2 * i + 2 >= n){ if(a[i * 2 + 1] > a[i]) swap(a[i* 2 + 1] , a[i]); } else{ int p = i * 2 + 1,q = i * 2 + 2; if(a[p] > a[q]) swap(p,q); if(a[i] < a[q]){ swap(a[q],a[i]); PercDown(a,q,n); } } } //(i + 1) * 2 (+ 1) - 1 = 2 * i + 1 || 2 * i + 2; void HeapSort(int a[],int n) { for(int i = n/2;i >= 0;--i){ //建堆(大根堆) PercDown(a,i,n); } for(int i = n-1;i >= 0;--i){ //更新大根堆 swap(a[0],a[i]); PercDown(a,0,i); } } //-------------------------快速排序------------------------// //时间复杂度 平均 O(nlogn) 最坏 O(n^{2}) //空间复杂度 O(logn) #include <bits/stdc++.h> using namespace std; int a[1000006]; void QuickSort(int a[],int l,int r) { int i,j,p; p = a[l]; i = l,j = r; while(i < j){ while(i < j && a[j] >= p){ //先移动右指针寻找大于哨兵的值 j--; } if(i != j){ a[i] = a[j]; } else break; while(i < j && a[i] <= p){ //后移动左指针寻找小于哨兵的值 i++; } if(i != j){ a[j] = a[i]; } else break; } a[j] = p; //指针相碰,指针位置就是哨兵的最终位置 if(l < j) QuickSort(a,l,j); if(j+1 < r)QuickSort(a,j+1,r); } //-----------------------直接插入排序----------------------// //时间复杂度 平均 O(n^{2}) 最坏 O(n^{2}) //空间复杂度 O(1) #include <bits/stdc++.h> using namespace std; int a[1000006]; void InsertSort(int a[],int n) { for(int i = 1;i < n;++i){ int p = a[i]; for(int j = i;j >= 0;--j){ if(a[j-1] > p) a[j] = a[j-1]; else{ a[j] = p; break; } } } } //-------------------------希尔排序------------------------// //时间复杂度 平均 O(nlogn) 最坏 O(n^{2}) //空间复杂度 O(1) #include <bits/stdc++.h> using namespace std; int a[1000006]; void ShellSort(int a[],int n) { for(int d = n/2;d > 0;d/=2){ //以n/2为增量序列 for(int p = d;p < n;++p){ int tmp = a[p]; int i = p; for(i = p;i >= d && a[i-d] > tmp; i-=d) a[i] = a[i-d]; a[i] = tmp; } } }