排序算法(选择、冒泡、插入)
选择、冒泡、插入排序的时间复杂度都是O(N2)
选择排序
key:每一次都选出i位置后面最小的与i元素交换位置
一共比较N-2(i:0 ~ N-2)轮,每一轮j:i+1 ~ N-1
class SelectionSort { public: void mySelectionSort(vector<int>& v) { if (v.size() < 2) return; for (int i = 0; i < v.size() - 1; i++) { int minIndex = i; for (int j = i + 1; j < v.size(); j++) { if (v[j] < v[minIndex]) minIndex=j; } mySwap(v, i, minIndex); } } public: void mySwap(vector<int>& v, int i, int j) { int temp = v[i]; v[i] = v[j]; v[j] = temp; } };
冒泡排序
key:谁大谁跑后面去,每一轮冒出来一个最大的(与选择排序的区别在于:相邻的比较,比完就换)
i:每次冒出来的位置;j:从0开始比较,一直比到i
class BubbleSort { public: void myBubbleSort(vector<int> &v) { if (v.size() < 2) return; for (int i = v.size()-1; i > 0; i--) { for (int j = 0; j < i; j++) { if (v[j] > v[j + 1]) mySwap(v, j, j + 1); } } } public: void mySwap(vector<int> &v, int i, int j) { int temp = v[i]; v[i] = v[j]; v[j] = temp; } };
插入排序
key:依次让前面有序
每一轮(i:1~ N-1)都让0~ 1,0~ 2,...,0~ N-1有序;
i位置的元素,每一轮都依次与前面的元素比较,小就交换,直到不比前面的小或者到头了停下来(j:i~1)
class InsertionSort { public: void myInsertionSort(vector<int> &v) { for (int i = 1; i < v.size(); i++) { for (int j = i; j > 0 && v[j] < v[j - 1]; j--) { mySwap(v, j, j - 1); } } } public: void mySwap(vector<int>& v, int i, int j) { int temp = v[i]; v[i] = v[j]; v[j] = temp; } };