冒泡排序
每次从头开始(每次结束可以不到最后,因为上一次已经确定最大值在末尾了),比较相邻两个数,每次下沉一个最大值。
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; }
|
排序算法比较