基本排序算法(随笔)
注:以下所介绍的排序算法,全部默认使用从小到大的顺序排序
一、冒泡排序
原理:从头开始遍历待排序数组,如果当前数组元素的值比下一个元素的值大,则交换两个元素;将较大的元素后移,直到最大的元素沉底。这样循环往复比较N趟之后,数组就变为有序数组了。
时间复杂度:O(n2)
空间复杂度:O(1)
代码示例:
1 /****************************************** 2 *************Bubble Sort****************** 3 ******************************************/ 4 void BubbleSort(vector<int> &nums) { 5 int len = nums.size(); 6 for (int i = 0; i < len - 1; i++) { 7 for (int j = 0; j < len - 1 - i; j++) { 8 if (nums[j] > nums[j + 1]) { 9 swap(nums[j], nums[j + 1]); 10 } 11 } 12 } 13 14 return; 15 }
二、归并排序
原理:归并排序是“分治法”思想的典型应用。通过将待排序数组进行切分,一直切分到不可切分为止,一般情况下是切分到只剩一个元素的时候就不可再分;然后,在将所有切分好的子数组在凉凉进行合并,合并的过程中,按照元素大小进行合并,合并完成后,数组也就完成了排序。
时间复杂度:O(nlogn)
空间复杂度:O(n)
代码示例:
1 /****************************************** 2 *************Merger Sort****************** 3 ******************************************/ 4 void MergerTwoArray(vector<int> &vec1, vector<int> &vec2, vector<int> &nums) { 5 int i = 0; 6 int j = 0; 7 int k = 0; 8 while (i < vec1.size() && j < vec2.size()) { 9 if (vec1[i] < vec2[j]) { 10 nums.push_back(vec1[i]); 11 i++; 12 } else { 13 nums.push_back(vec2[j]); 14 j++; 15 } 16 } 17 18 for (int index = j; index < vec2.size(); index++) { 19 nums.push_back(vec2[index]); 20 } 21 22 for (int index = i; index < vec1.size(); index++) { 23 nums.push_back(vec1[index]); 24 } 25 26 return; 27 } 28 29 void MergerSort(vector<int> &nums) 30 { 31 int len = nums.size(); 32 if (len < 2) 33 return; 34 35 int mid = len / 2; 36 vector<int> vec_sub1; 37 vector<int> vec_sub2; 38 for (int i = 0; i < mid; i++) { 39 vec_sub1.push_back(nums[i]); 40 } 41 42 for (int i = mid; i < len; i++) { 43 vec_sub2.push_back(nums[i]); 44 } 45 46 MergerSort(vec_sub1); 47 MergerSort(vec_sub2); 48 49 nums.clear(); 50 MergerTwoArray(vec_sub1, vec_sub2, nums); 51 return; 52 }
三、快速排序
原理:
代码示例:
1 /****************************************** 2 *************Quick Sort******************* 3 ******************************************/ 4 void QuickSort(int start, int end, vector<int> &nums) 5 { 6 int len = nums.size(); 7 if (start >= end) 8 return; 9 10 int i = start; 11 int j = end; 12 int base = nums[start]; //base num 13 while (i < j) { 14 while (nums[j] >= base && i < j){ 15 j--; 16 } 17 18 while (nums[i] <= base && i < j) { 19 i++; 20 } 21 22 if (i < j) 23 { 24 swap(nums[i], nums[j]); 25 } 26 } 27 28 //基数归位 29 nums[start] = nums[i]; 30 nums[i] = base; 31 QuickSort(start, i - 1, nums); 32 QuickSort(i + 1, end, nums); 33 34 return; 35 }
四、选择排序
原理:
代码示例:
1 /****************************************** 2 *************Select Sort****************** 3 ******************************************/ 4 void SelectSort(vector<int> &nums) 5 { 6 int len = nums.size(); 7 int i = 0; 8 int j = 0; 9 for (; i < len - 1; i++) { 10 int minVal = nums[i]; 11 int index = i; 12 for (j = i + 1; j < len; j++) { 13 if (nums[j] < minVal) { 14 minVal = nums[j]; 15 index = j; 16 } 17 } 18 19 swap(nums[i], nums[index]); 20 } 21 22 return; 23 }
五、插入排序
原理:
代码示例:
1 /****************************************** 2 *************Insert Sort****************** 3 ******************************************/ 4 void InsertionSort(vector<int> &nums) { 5 int len = nums.size(); 6 for (int i = 0; i < len - 1; i++) { 7 int tmp = nums[i + 1]; 8 int j = i; 9 while (j >= 0 && nums[j] > tmp) { 10 nums[j + 1] = nums[j]; 11 j--; 12 } 13 14 nums[j + 1] = tmp; 15 } 16 17 return; 18 }
六、希尔排序
原理:
代码示例:
1 /****************************************** 2 *************Shell Sort******************* 3 ******************************************/ 4 void ShellSort(vector<int> &nums) 5 { 6 int len = nums.size(); 7 for (int gap = len / 2; gap > 0; gap /= 2) { 8 for (int i = gap; i < len; i++) { 9 int j = i; 10 while (j - gap >= 0 && nums[j - gap] > nums[j]) { 11 swap(nums[j - gap], nums[j]); 12 j -= gap; 13 } 14 } 15 } 16 17 return; 18 }
七、计数排序
原理:
代码示例:
1 /****************************************** 2 *************Counting Sort**************** 3 ******************************************/ 4 int GetMaxValue(vector<int> &vec) 5 { 6 int maxVal = INT_MIN; 7 for (auto v : vec) { 8 if (v > maxVal) 9 maxVal = v; 10 } 11 12 return maxVal; 13 } 14 15 void CountingSort(vector<int> &nums, int maxValue) 16 { 17 vector<int> vec_tmp(nums.begin(), nums.end()); 18 vector<int> count(maxValue + 1, 0); 19 20 for (auto v : vec_tmp) { 21 count[v]++; 22 } 23 24 int index = 0; 25 for (int i = 0; i < count.size(); i++) { 26 while (count[i] > 0) { 27 nums[index++] = i; 28 count[i]--; 29 } 30 } 31 32 return; 33 } 34 35 void CountingSort(vector<int> &nums) 36 { 37 int maxVal = GetMaxValue(nums); 38 CountingSort(nums, maxVal); 39 return; 40 }
十一、测试主程序
说明:
示例:
1 int main() 2 { 3 /*************Bubble Sort******************/ 4 int arr[10]{1,8,6,10,9,3,5,4,2,7}; 5 cout<<"Bubble Sort Befofe:"; 6 vector<int> vec(arr, arr + 10); 7 for (auto v : vec) 8 cout<<v<<" "; 9 cout<<endl; 10 11 BubbleSort(vec); 12 cout<<"Bubble Sort After :"; 13 for (auto v : vec) 14 cout<<v<<" "; 15 cout<<endl; 16 cout<<endl; 17 /*************Merger Sort******************/ 18 int arr1[10]{8,1,10,6,9,3,5,4,2,7}; 19 cout<<"Merger Sort Befofe:"; 20 vector<int> vec1(arr1, arr1 + 10); 21 for (auto v : vec1) 22 cout<<v<<" "; 23 cout<<endl; 24 25 MergerSort(vec1); 26 cout<<"Merger Sort After :"; 27 for (auto v : vec1) 28 cout<<v<<" "; 29 cout<<endl; 30 cout<<endl; 31 /*************Quick Sort******************/ 32 int arr2[10]{10,8,1,9,7,3,5,4,2,6}; 33 cout<<"Quick Sort Befofe :"; 34 vector<int> vec2(arr2, arr2 + 10); 35 for (auto v : vec2) 36 cout<<v<<" "; 37 cout<<endl; 38 39 QuickSort(0, vec2.size() - 1, vec2); 40 cout<<"Quick Sort After :"; 41 for (auto v : vec2) 42 cout<<v<<" "; 43 cout<<endl; 44 cout<<endl; 45 46 /*************Select Sort******************/ 47 int arr3[10]{6,8,10,9,7,3,5,2,1,4}; 48 cout<<"Select Sort Befofe:"; 49 vector<int> vec3(arr3, arr3 + 10); 50 for (auto v : vec3) 51 cout<<v<<" "; 52 cout<<endl; 53 54 SelectSort(vec3); 55 cout<<"Select Sort After :"; 56 for (auto v : vec3) 57 cout<<v<<" "; 58 cout<<endl; 59 cout<<endl; 60 61 /*************Insert Sort******************/ 62 int arr4[10]{5,8,10,7,1,3,9,2,6,4}; 63 cout<<"Insert Sort Befofe:"; 64 vector<int> vec4(arr4, arr4 + 10); 65 for (auto v : vec4) 66 cout<<v<<" "; 67 cout<<endl; 68 69 InsertionSort(vec4); 70 cout<<"Insert Sort After :"; 71 for (auto v : vec4) 72 cout<<v<<" "; 73 cout<<endl; 74 cout<<endl; 75 76 /*************Shell Sort******************/ 77 int arr5[10]{7,8,10,9,5,3,1,2,6,4}; 78 cout<<"Shell Sort Befofe :"; 79 vector<int> vec5(arr5, arr5 + 10); 80 for (auto v : vec5) 81 cout<<v<<" "; 82 cout<<endl; 83 84 ShellSort(vec5); 85 cout<<"Shell Sort After :"; 86 for (auto v : vec5) 87 cout<<v<<" "; 88 cout<<endl; 89 cout<<endl; 90 91 /*************Counting Sort***************/ 92 int arr6[10]{4,8,10,9,5,3,1,2,6,7}; 93 cout<<"Counting Sort Befofe :"; 94 vector<int> vec6(arr6, arr6 + 10); 95 for (auto v : vec6) 96 cout<<v<<" "; 97 cout<<endl; 98 99 CountingSort(vec6); 100 cout<<"Counting Sort After :"; 101 for (auto v : vec6) 102 cout<<v<<" "; 103 cout<<endl; 104 cout<<endl; 105 return 0; 106 }

浙公网安备 33010602011771号