基本排序算法(随笔)

注:以下所介绍的排序算法,全部默认使用从小到大的顺序排序

一、冒泡排序

原理:从头开始遍历待排序数组,如果当前数组元素的值比下一个元素的值大,则交换两个元素;将较大的元素后移,直到最大的元素沉底。这样循环往复比较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 }

 

posted @ 2022-06-12 10:31  Leeony  阅读(35)  评论(0)    收藏  举报