排序模板
Posted tpgzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序模板相关的知识,希望对你有一定的参考价值。
下面的快排不知道在luogu上提交错误,有看出来的请给我提出错误,谢谢。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<cstdlib> 7 #include<ctime> 8 using namespace std; 9 10 int a[100007]; 11 int b[100]; 12 int ans; 13 14 void bubble_sort(int *a, int l, int r, int n) 15 { 16 for (int i = 1; i < n; i++) 17 { 18 for (int j = l; j < r; j++) 19 { 20 if (a[j] > a[j + 1]) swap(a[j], a[j + 1]); 21 } 22 } 23 }//冒泡排序 24 25 void merge_sort(int *a, int l, int r) 26 { 27 if (l == r) return; 28 int mid = (l + r) >> 1; 29 merge_sort(a, l, mid); 30 merge_sort(a, mid + 1, r); 31 32 int i = l, j = mid + 1; 33 //b:辅助数组 34 for (int k = l; k <= r; k++) 35 { 36 if (j > r || (i <= mid && a[i] < a[j])) 37 { 38 b[k] = a[i]; 39 i++; 40 ans += j - (mid + 1); 41 } 42 else 43 { 44 b[k] = a[j]; 45 j++; 46 } 47 } 48 for (int k = l; k <= r; k++) 49 a[k] =b[k]; 50 }//归并排序 求逆序对 51 52 53 void quick_sort(int *a, int l, int r) 54 { 55 swap(a[l], a[rand()*rand() % (r -l + 1) +l]); 56 int tmp = a[l]; 57 int l_ = l, r_ = r; 58 while (l < r) 59 { 60 while (l < r) 61 { 62 if (a[r] > tmp) r--; //a[r]落在正确的位置 63 else 64 { 65 a[l] = a[r]; 66 l++; 67 break; 68 } 69 } 70 while (l < r) 71 { 72 if (a[l] < tmp) l++; //a[l]落在正确的位置 73 else 74 { 75 a[r] = a[l]; 76 r--; 77 break; 78 } 79 } 80 } 81 a[l] = tmp; 82 if (l - l_ > 1) quick_sort(a, l_, l - 1); 83 if (r_ - r > 1) quick_sort(a, r + 1, r_); 84 }//快排 85 86 int quick_select(int *a, int l, int r, int k) 87 { 88 swap(a[l], a[rand()*rand() % (r -l + 1) +l]); 89 int tmp = a[l]; 90 int l_ = l, r_ = r; 91 while (l < r) 92 { 93 while (l < r) 94 { 95 if (a[r] > tmp)r-- ; //a[r]落在正确的位置 96 else 97 { 98 a[l] = a[r]; 99 l++; 100 break; 101 } 102 } 103 while (l < r) 104 { 105 if (a[l] < tmp) l++; //a[l]落在正确的位置 106 else 107 { 108 a[r] = a[l]; 109 r--; 110 break; 111 } 112 } 113 } 114 a[l] = tmp; 115 if (k == l - l_ + 1) return a[l]; 116 if (k < l - l_ + 1) return quick_select(a, l_, l - 1, k); 117 if (k > l - l_ + 1) return quick_select(a, r + 1, r_, k - (l - l_ + 1)); 118 }//寻找第K大的数 119 120 121 122 int main() 123 { 124 125 int n; 126 cin>>n; 127 srand(time(0)); 128 129 for (int i = 0; i < n; i++) 130 //a[i] = rand(); 131 cin >> a[i]; 132 133 //bubble_sort(a, 0, n - 1, n); 134 quick_sort(a, 0, n - 1); 135 //int k = 5; 136 //cout << quick_select(a, 0, n -1, k) << endl; 137 //merge_sort(a, 0, n - 1); 138 for (int i = 0; i < n; i++) 139 cout << a[i] << ‘ ‘; 140 //cout << ans << endl; 141 cout << endl; 142 return 0; 143 }
以上是关于排序模板的主要内容,如果未能解决你的问题,请参考以下文章