排序算法
基础排序算法
冒泡排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class MAOPAOSORT { public: void sort(vector<int>& nums) { if(nums.empty()) { return; } maopaosort(nums); } private: void swap(int& a, int& b) { int temp = a; a = b; b = temp; } void maopaosort(vector<int>& nums) { for (int i = 0; i < nums.size(); i++) { for (int j = 0; j < nums.size() - i - 1; j++) { if (nums[j] > nums[j + 1]) { swap(nums[j], nums[j + 1]); } } } } }
|
时间复杂度:O(n^2),空间复杂度:O(1)
选择排序
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
| class CHOICESORT { public: void sort(vector<int>& nums) { if(nums.empty()) { return; } choicesort(nums); } private: void choiceswap(int& a, int& b) { int temp = a; a = b; b = temp; } void sort(vector<int>& nums) { for (int i = 0; i < nums.size(); i++) { int min = i; for (int j = i + 1; j < nums.size(); j++) { if (nums[j] < nums[min]) { min = j; } } swap(nums[i], nums[min]); } } }
|
时间复杂度:O(n^2),空间复杂度:O(1)
插入排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class INSERTSORT { public: void sort(vector<int>& nums) { if(nums.empty()) { return; } insertsort(nums); } private: void insertsort(vector<int>& nums) { for (int i = 1; i < nums.size(); i++) { int temp = nums[i]; int j = i - 1; while (j >= 0 && nums[j] > temp) { nums[j + 1] = nums[j]; j--; } nums[j + 1] = temp; } } }
|
时间复杂度:O(n^2),空间复杂度:O(1)
归并排序
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
| class MERGESORT { public: void sort(vector<int>& nums) { if(nums.empty()) { return; } mergesort(nums, 0, nums.size() - 1); } private: void merge(vector<int>& nums, int left, int mid, int right) { vector<int> temp(right - left + 1); int i=left, j=mid+1, k=0; while (i<=mid || j<=right) { if (i > mid) { temp[k++] = nums[j++]; } else if (j > right) { temp[k++] = nums[i++]; } else{ if(nums[i] < nums[j]) { temp[k++] = nums[i++]; } else{ temp[k++] = nums[j++]; } } } for (int p = 0; p < temp.size(); p++) { nums[left + p] = temp[p]; } } void mergesort(vector<int>& nums, int left, int right) { if (left >= right) { return; } int mid = left + ( right - left ) >> 1; mergesort(nums, left, mid); mergesort(nums, mid + 1, right); merge(nums, left, mid, right); } }
|
时间复杂度:O(nlogn),空间复杂度:O(n)
快速排序
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
| class QUICKSORT { public: void sort(vector<int>& nums) { if(nums.empty()) { return; } sort(nums, 0, nums.size() - 1); } private: void quicksort(vector<int>& nums, int left, int right) { if (left >= right) { return; } int i = left, j = right; int temp = nums[left]; while (i < j) { while (i < j && nums[j] >= temp) { j--; } nums[i] = nums[j]; while (i < j && nums[i] <= temp) { i++; } nums[j] = nums[i]; } nums[i] = temp; quicksort(nums, left, i - 1); quicksort(nums, i + 1, right); } }
|
时间复杂度:O(nlogn),空间复杂度:O(logn)
猴子排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class MONKEYSORT { public: void sort(vector<int>& nums) { if(nums.empty()) { return; } srand(time(NULL)); sort(nums); } private: void monkeysort(vector<int>& nums) { while (!isSorted(nums)) { for (int i = 0; i < nums.size(); i++) { int j = rand() % nums.size(); swap(nums[i], nums[j]); } } } }
|
时间复杂度:O(n!) ,空间复杂度:O(1)
end
