俗话说:天下武功,无坚不破。对于算法当然也是要使用时间最快、占用空间最小的算法来实现了。下面就是最简单的两种快排(其实可以算是一种)。
注意:我代码里面打的备注仅供参考,建议不要背模板(因为没有固定的模板),可以写一个数列按着代码跑两圈或者把代码改一下输出每次排序后的结果。
总之,师傅领进门,修行在个人。奋斗把!骚年!
※冒泡排序、选择排序:
1 #include "cstdio" 2 #include "iostream" 3 using namespace std; 4 5 void bubble_sort (int *a, int n) { 6 int t; 7 for (int i = 0; i < n - 1; ++i) { 8 for (int j = 0; j < n - i - 1; ++j) { 9 if (a[j] > a[j + 1]) { 10 t = a[j]; 11 a[j] = a[j + 1]; 12 a[j + 1] = t; 13 } 14 } 15 } 16 } 17 18 int main () { 19 int n, a[999]; 20 cin >> n; 21 for (int i = 0; i < n; ++i) 22 cin >> a[i]; 23 bubble_sort (a, n); 24 for (int i = 0; i < n; ++i) 25 cout << a[i] << " "; 26 cout << endl; 27 return 0; 28 }
bubble sort
1 #include "cstdio" 2 #include "iostream" 3 using namespace std; 4 5 void selection_sort (int *a, int n) { 6 int t; 7 for (int i = 0; i < n; ++i) { 8 for (int j = i; j < n; ++j) { 9 if (a[i] > a[j]) { 10 t = a[j]; 11 a[j] = a[i]; 12 a[i] = t; 13 } 14 } 15 } 16 } 17 18 int main () { 19 int n, a[999]; 20 cin >> n; 21 for (int i = 0; i < n; ++i) 22 cin >> a[i]; 23 selection_sort (a, n); 24 for (int i = 0; i < n; ++i) 25 cout << a[i] << " "; 26 cout << endl; 27 return 0; 28 }
selection sort
如果说冒泡和选择排序都没有弄明白的话,那你对于排序可以只记个sort函数和头文件就行了。
※基础快排1----选择左右两边为基准排序:
1 #include <bits/stdc++.h>//万能头文件 2 using namespace std; 3 4 void quick_sort (int a[], int l, int r) { 5 if (l >= r) return ; 6 int i = l, j = r; 7 int key = a[l]; 8 while (i < j) { ///这里不能带等号,,死循环 9 while (i < j && a[j] >= key) {//<=是找有相同数字的时候 10 j --; //选的左边作为key,所以就从右边开始. 11 } 12 a[i] = a[j]; //找到一个该交换的时候退出交换。 13 while (i < j && a[i] <= key) { //<=是找有相同数字的时候 14 i ++; 15 } 16 a[j] = a[i]; //同上 17 } 18 a[i] = key; 19 quick_sort (a, l, i - 1);////应该可以交换位置,因为这两个是等效的, 20 quick_sort (a, i + 1, r);////就是排序上次key两的的值 21 } 22 23 int main () { 24 int n; 25 int a[999]; 26 scanf ("%d", &n); 27 for (int i = 0; i < n; ++i) 28 { 29 scanf ("%d", &a[i]); 30 } 31 quick_sort (a, 0, n - 1); 32 for (int i = 0; i < n; ++i) 33 { 34 printf("%d ", a[i]); 35 } 36 printf("\n"); 37 return 0; 38 }
Quick_sort_by_left
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 void quick_sort (int a[], int l, int r) { 5 if (l >= r) return ; 6 int i = l, j = r; 7 int key = a[r]; 8 while (i < j) { ///这里不能带等号,,死循环 9 while (i < j && a[i] <= key) {//<=是找有相同数字的时候 10 i ++; //选的右边作为key,所以就从左边开始. 11 } 12 a[j] = a[i]; //找到一个该交换的时候退出交换。 13 while (i < j && a[j] >= key) { //<=是找有相同数字的时候 14 j --; 15 } 16 a[i] = a[j]; //同上 17 } 18 a[j] = key;//-----先替换的a[j],所以在这里补上. 19 quick_sort (a, l, i - 1);////可以交换位置,是等效的 20 quick_sort (a, i + 1, r);////就是排序上次key两的的值 21 } 22 23 int main () { 24 int n; 25 int a[999]; 26 scanf ("%d", &n); 27 for (int i = 0; i < n; ++i) 28 { 29 scanf ("%d", &a[i]); 30 } 31 quick_sort (a, 0, n - 1); 32 for (int i = 0; i < n; ++i) 33 { 34 printf("%d ", a[i]); 35 } 36 printf("\n"); 37 return 0; 38 }
Quick_sort_by_right
注意:理解代码里面等号的取舍!
※基础快排2----选择任意数字为基准排序:
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 5 void quick_sort (int *a, int l, int r) { 6 int i = l, j = r, key = a[l + (r - l) / 2]; 7 //int key = a[r]; 8 //从数列里面任意找一个key就行 9 int t; 10 while (i < j) { 11 while (i < r && a[i] < key) i ++; 12 //不能写成a[i] <= key,会跳过一些数字,导致不能排序 13 while (j > l && a[j] > key) j --; 14 //这两个while可以交换位置,以左右为基准的快排不能交换 15 if (i <= j) { //此处必须有等号,跳过相同的时候 16 t = a[i]; 17 a[i] = a[j]; 18 a[j] = t; 19 20 i ++; 21 j --; 22 } 23 } 24 if (i <= r) quick_sort (a, i, r); 25 // 这里的等号可有可无,没有最好,少一次循环 26 if (j > l) quick_sort (a, l, j); 27 } 28 29 int main () { 30 int n; 31 int a[999]; 32 cin >> n; 33 for (int i = 0; i < n; ++i) 34 cin >> a[i]; 35 quick_sort (a, 0, n - 1); 36 for (int i = 0; i < n; ++i) 37 cout << a[i] << " "; 38 cout << endl; 39 return 0; 40 }
Quick_sort_anyone
欢迎码友评论,一起成长。
时间: 2024-10-07 12:21:26