• 七大排序。。。


    • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
    • 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
    • 内排序:所有排序操作都在内存中完成;
    • 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
    • 时间复杂度: 一个算法执行所耗费的时间。
    • 空间复杂度:运行完一个程序所需内存的大小。

    稳定的排序:冒泡排序,插入排序,归并排序
    不稳定的排序:选择排序,堆排序,快速排序,希尔排序

    平均时间复杂度T(n) = O(nlogn)希尔排序,归并排序,快速排序,堆排序
    平均时间复杂度T(n) = O(n²)冒泡排序,简单选择排序,插入排序

    最好时间复杂度T(n) = O(n)冒泡排序,插入排序
    最好时间复杂度T(n) = O(nlogn)归并排序,快速排序,堆排序
    最好时间复杂度T(n) = O(n²)简单选择排序

    最坏时间复杂度T(n) = O(nlogn)归并排序,堆排序
    最坏时间复杂度T(n) = O(n²)冒泡排序,简单选择排序,插入排序,快速排序

    空间复杂度O(1)冒泡排序,简单选择排序,插入排序,希尔排序,堆排序
    空间复杂度O(n)归并排序
    空间复杂度O(nlogn)快速排序

    (1)当数据规模较小时候,可以使用简单的直接插入排序或者直接选择排序

    (2)当文件的初态已经基本有序,可以用直接插入排序冒泡排序

    (3)当数据规模较大时,应用速度最快的排序算法,可以考虑使用快速排序。当记录随机分布的时候,快速排序平均时间最短,但是出现最坏的情况,这个时候的时间复杂度是O(n^2),且递归深度为n,所需的占空间为O(n)。

    (4)堆排序不会出现快排那样最坏情况,且堆排序所需的辅助空间比快排要少,但是这两种算法都不是稳定的,要求排序时是稳定的,可以考虑用归并排序

    (5)归并排序可以用于内部排序,也可以使用于外部排序。在外部排序时,通常采用多路归并,并且通过解决长顺串的合并,缠上长的初始串,提高主机与外设并行能力等,以减少访问外存额外次数,提高外排的效率。

    在这里插入图片描述

    1. #include <iostream>
    2. #include <vector>
    3. #include <algorithm>
    4. #include <numeric>
    5. #include <stdio.h>
    6. using namespace std;
    7. void heapy(vector<int> &nums, int st, int en)
    8. {
    9. int dad = st;
    10. int son = dad * 2 + 1;
    11. while (son <= en)
    12. {
    13. if (son <= en - 1 && nums[son] < nums[son + 1])
    14. son++;
    15. if (nums[dad] > nums[son])
    16. return;
    17. else
    18. {
    19. swap(nums[dad], nums[son]);
    20. dad = son;
    21. son = dad * 2 + 1;
    22. }
    23. }
    24. }
    25. void heapysort(vector<int> &nums)
    26. {
    27. int n = nums.size();
    28. for (int i = n / 2 - 1; i >= 0; --i)
    29. heapy(nums, i, n - 1);
    30. for (int i = n - 1; i > 0; --i)
    31. {
    32. swap(nums[i], nums[0]);
    33. heapy(nums, 0, i - 1);
    34. }
    35. }
    36. void maopaosort(vector<int> &nums)
    37. {
    38. for (int i = 0; i < nums.size(); ++i)
    39. for (int j = 0; j < nums.size() - i - 1; ++j)
    40. if (nums[j] > nums[j + 1])
    41. swap(nums[j], nums[j + 1]);
    42. }
    43. void selsort(vector<int> &nums)
    44. {
    45. for (int i = 0; i < nums.size(); ++i)
    46. {
    47. int id = i;
    48. for (int j = i + 1; j < nums.size(); ++j)
    49. {
    50. if (nums[j] < nums[id])
    51. id = j;
    52. }
    53. swap(nums[i], nums[id]);
    54. }
    55. }
    56. void insertsort(vector<int> &nums)
    57. {
    58. for (int i = 1; i < nums.size(); ++i)
    59. {
    60. if (nums[i] < nums[i - 1])
    61. {
    62. int id = i - 1;
    63. int min = nums[i];
    64. while (id >= 0 && nums[id] > min)
    65. {
    66. nums[id + 1] = nums[id];
    67. id--;
    68. }
    69. nums[id + 1] = min;
    70. }
    71. }
    72. }
    73. int Paritition1(vector<int> &A, int low, int high)
    74. {
    75. int pivot = A[low];
    76. while (low < high)
    77. {
    78. while (low < high && A[high] >= pivot)
    79. {
    80. --high;
    81. }
    82. A[low] = A[high];
    83. while (low < high && A[low] <= pivot)
    84. {
    85. ++low;
    86. }
    87. A[high] = A[low];
    88. }
    89. A[low] = pivot;
    90. return low;
    91. }
    92. void QuickSort(vector<int> &A, int low, int high) //快排母函数
    93. {
    94. if (low < high)
    95. {
    96. int pivot = Paritition1(A, low, high);
    97. QuickSort(A, low, pivot - 1);
    98. QuickSort(A, pivot + 1, high);
    99. }
    100. }
    101. void shell_sort(vector<int> &array)
    102. {
    103. int h = 1;
    104. int length = array.size();
    105. while (h < length / 3)
    106. {
    107. h = 3 * h + 1;
    108. }
    109. while (h >= 1)
    110. {
    111. for (int i = h; i < length; i++)
    112. for (int j = i; j >= h && array[j] < array[j - h]; j -= h)
    113. swap(array[j], array[j - h]);
    114. h = h / 3;
    115. }
    116. }
    117. void mergeSortCore(vector<int> &data, vector<int> &dataTemp, int low, int high)
    118. {
    119. if (low >= high)
    120. return;
    121. int len = high - low, mid = low + len / 2;
    122. int start1 = low, end1 = mid, start2 = mid + 1, end2 = high;
    123. mergeSortCore(data, dataTemp, start1, end1);
    124. mergeSortCore(data, dataTemp, start2, end2);
    125. int index = low;
    126. while (start1 <= end1 && start2 <= end2)
    127. {
    128. dataTemp[index++] = data[start1] < data[start2] ? data[start1++] : data[start2++];
    129. }
    130. while (start1 <= end1)
    131. {
    132. dataTemp[index++] = data[start1++];
    133. }
    134. while (start2 <= end2)
    135. {
    136. dataTemp[index++] = data[start2++];
    137. }
    138. for (index = low; index <= high; ++index)
    139. {
    140. data[index] = dataTemp[index];
    141. }
    142. }
    143. void mergeSort(vector<int> &data)
    144. {
    145. int len = data.size();
    146. vector<int> dataTemp(len, 0);
    147. mergeSortCore(data, dataTemp, 0, len - 1);
    148. }
    149. void printvec(vector<int> nums)
    150. {
    151. for (int i : nums)
    152. {
    153. cout << i << " ";
    154. }
    155. cout << endl;
    156. }
    157. int main()
    158. {
    159. vector<int> a = {1, 2, 1, 0, 5};
    160. // heapysort(a);
    161. // maopaosort(a);
    162. // selsort(a);
    163. mergeSort(a);
    164. printvec(a);
    165. }

  • 相关阅读:
    Python深度学习入门 - - 卷积神经网络学习笔记
    Generate Label from Click
    word 如何编写4x4矩阵
    day06_面向对象基础
    4.7k Star!全面的C#/.NET/.NET Core学习、工作、面试指南
    【机器学习】决策树
    C++基础
    grafana+prometheus+(采集节点)实现监控Linux服务器,JVM,Postgres
    【SpringBoot篇】分页查询 | 扩展SpringMvc的消息转换器
    软件接口安全设计规范及审计要点
  • 原文地址:https://blog.csdn.net/weixin_44846677/article/details/126810228