冒泡排序
每次从头开始(每次结束可以不到最后,因为上一次已经确定最大值在末尾了),比较相邻两个数,每次下沉一个最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#include <iostream> using namespace std; void bubbleSort ( int a[], int length) { bool swapFlag; for ( int i = 1; i < length; i++) // 两个数,冒泡排序 1 次; length 个数,冒泡排序 length-1 次。 { swapFlag = false ; for ( int j = 0; j < length - i; j++) // 注意终止条件 length-i ,每次下沉一个最大数,不用比较到最后已确定的数。 { if (a[j] > a[j+1]) { swapFlag = true ; swap(a[j], a[j+1]); } } if (swapFlag == false ) { break ; } } } int main () { int array[9] = {50, 10, 90, 30, 70, 40, 80, 60, 20}; bubbleSort(array,9); for ( int i = 0; i < 9; i++) { cout << array[i] << endl; } return 0; }
插入排序
将数插入到已排序数组中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#include <iostream> #include <vector> using namespace std; template < class T > void insertSort ( vector < T > &vec) { for ( int i = 1; i < vec.size(); i++) { int j; T tmp = vec[i]; for (j = i; (j > 0) && (tmp < vec[j-1]); j—) //是后移,不是交换。 { vec[j]=vec[j-1]; } vec[j] = tmp; } } int main () { int array[9] = {50, 10, 90, 30, 70, 40, 80, 60, 20}; vector < int > intVec(array, array + 9); insertSort(intVec); for ( vector < int >:: iterator iter = intVec.begin(); iter != intVec.end(); iter++) { cout << *iter << endl; } }
希尔排序
缩减增量排序,特殊的插入排序,每个增量的排序都是插入排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#include <iostream> #include <vector> using namespace std; void shellSort ( vector < int > &a, int length) { for ( int gap = length / 2; gap > 0; gap /= 2) { for ( int i = gap; i < length; i++) { int j; int tmp = a[i]; for (j = i; (j - gap >= 0) && (tmp < a[j-gap]); j -= gap) { a[j] = a[j-gap]; } a[j] = tmp; } } } int main () { int a[] = {9,8,7,6,5,4,3,2,1,0,11}; vector < int > vec(a, a+11); shellSort(vec, 11); for ( vector < int >:: iterator iter = vec.begin(); iter != vec.end(); iter++) { cout << *iter << endl; } return 0; }
快速排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
#include <iostream> #include <vector> using namespace std; void quicksort ( vector < int > &v, int left, int right) { if (left >= right) { return ; } int low = left; int high = right; //right 是结束位, right-1 是倒数第一个数。 int pivot = v[low]; // 第一个值作为中枢值。 while (low < high) { while (low < high && v[--high] > pivot) //--high 从倒数第一个数向前找到第一个不大于 key 的值。 NULL; while (low < high && v[++low] < pivot) // 从第 2 个数( v[low+1] )向后找到第一个不小于 key 的值 (v[low] 是中枢值,不参与排序 ). NULL; if (low < high) { swap(v[low], v[high]); } else { break ; } } swap(v[low], v[left]); // 将中枢值与不大于中枢值的最大值交换,至此, v[low] 是本次排序中枢值, low 左边的数都不大于中枢值, low 右边的数都不小于中枢值。 quicksort(v, left, low); quicksort(v, low + 1, right); } int main () { int a[10] = { 9,8,7,9,5,4,3,2,1,0 }; vector < int > vec(a, a + 10); quicksort(vec, 0, 10); for ( vector < int >:: iterator iter = vec.begin(); iter != vec.end();iter++) { cout << *iter << endl; } return 0; }
排序算法比较
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步