当前位置:   article > 正文

排序算法刷题【两数之和】,C++的sort()排序的使用

排序算法刷题【两数之和】,C++的sort()排序的使用

一、C++的sort()排序算法

sort()函数整体使用的代码如下所示:

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. //sort()排序函数的使用
  6. //自定义的结构体
  7. typedef struct
  8. {
  9. int x;
  10. int y;
  11. }myData;
  12. template<typename T>
  13. int* getRandData(int n)
  14. {
  15. T* ptr = (int*)malloc(sizeof(int) * n);
  16. for (int i = 0; i < n; i++) *(ptr + i) = rand() % 1000;
  17. return ptr;
  18. }
  19. template<typename T>
  20. void getRandData(vector<T>& v, int n)
  21. {
  22. for (int i = 0; i < n; i++) v.push_back(rand() % 1000);
  23. }
  24. template<typename T>
  25. void displayData(T* ptr, int n)
  26. {
  27. cout << "\r\nArry_data:";
  28. for (int i = 0; i < n; i++)
  29. {
  30. cout << *(ptr + i) << " ";
  31. }
  32. }
  33. template<typename T>
  34. void displayData(vector<T>& v)
  35. {
  36. cout << "\r\nVector_data:";
  37. for (int i = 0; i < v.size(); i++)
  38. {
  39. cout << v[i] << " ";
  40. }
  41. }
  42. template<typename T>
  43. void displayMyData(vector<T>& v)
  44. {
  45. cout << "\r\nVector_x:";
  46. for (int i = 0; i < v.size(); i++)
  47. {
  48. cout << v[i].x << " ";
  49. }
  50. cout << " Vector_y:";
  51. for (int i = 0; i < v.size(); i++)
  52. {
  53. cout << v[i].y << " ";
  54. }
  55. }
  56. /* sort()函数对自定义数组的排序使用的规则函数 */
  57. bool cmp(const myData& a, const myData& b)
  58. {
  59. if (a.x != b.x) return a.x < b.x;
  60. return a.x > b.x;
  61. }
  62. void test()
  63. {
  64. int* a = NULL;
  65. int* ind = NULL;
  66. vector<int> v;
  67. a = getRandData<int>(10);
  68. ind = getRandData<int>(10);
  69. displayData<int>(a, 10);
  70. sort(a, a + 10); //从小到大排序
  71. displayData<int>(a, 10);
  72. sort(a, a + 10, greater<int>()); //从大到小排序
  73. displayData<int>(a, 10);
  74. sort(ind, ind + 10, [&](int i, int j) -> bool {
  75. return a[i] < a[j];
  76. });
  77. displayData<int>(a, 10);
  78. cout << "\r\n";
  79. getRandData<int>(v, 10);
  80. displayData<int>(v);
  81. sort(v.begin(), v.end());
  82. displayData<int>(v);
  83. sort(v.begin(), v.end(), greater<int>());
  84. displayData<int>(v);
  85. cout << "\r\n";
  86. free(a);
  87. a = NULL;
  88. }
  89. /* sort对自定义数据类型的排序的两种实现方式 */
  90. void test1()
  91. {
  92. vector<myData> v1, v2;
  93. for (int i = 0; i < 10; i++)
  94. {
  95. myData data;
  96. data.x = rand() % 10;
  97. data.y = rand() % 10;
  98. v1.push_back(data);
  99. data.x = rand() % 10;
  100. data.y = rand() % 10;
  101. v2.push_back(data);
  102. }
  103. displayMyData<myData>(v1);
  104. //自定义的sort()排序,使用自定义的cmp比较函数
  105. sort(v1.begin(), v1.end(), cmp);
  106. displayMyData<myData>(v1);
  107. }
  108. int main()
  109. {
  110. test();
  111. return 0;
  112. }

1.1、sort()实现递增排序、递减排序

(1)sort递增排序
  1. a = getRandData<int>(10); //创建数组
  2. ind = getRandData<int>(10);
  3. displayData<int>(a, 10);
  4. sort(a, a + 10); //从小到大排序,数组的首地址、数组最后元素的后一个地址
(2)sort递减排序
  1. a = getRandData<int>(10); //创建一个数组
  2. sort(a, a + 10, greater<int>()); //从大到小排序,传入greater<int>()方法

1.1、sort对自定义数据类型的排序

(1)自定义比较方法函数
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm> //sort()排序函数的头文件
  4. //自定义的结构体
  5. typedef struct
  6. {
  7. int x;
  8. int y;
  9. }myData;
  10. bool cmp(const myData& a, const myData& b)
  11. {
  12. if (a.x != b.x) return a.x < b.x;
  13. return a.x > b.x;
  14. }
  15. void test1()
  16. {
  17. vector<myData> v1, v2;
  18. for (int i = 0; i < 10; i++)
  19. {
  20. myData data;
  21. data.x = rand() % 10;
  22. data.y = rand() % 10;
  23. v1.push_back(data);
  24. data.x = rand() % 10;
  25. data.y = rand() % 10;
  26. v2.push_back(data);
  27. }
  28. displayMyData<myData>(v1);
  29. //自定义的sort()排序,使用自定义的cmp比较函数
  30. sort(v1.begin(), v1.end(), cmp);
  31. displayMyData<myData>(v1);
  32. }
(2)使用表达式的方式
  1. int* a = NULL;
  2. int* ind = NULL;
  3. vector<int> v;
  4. a = getRandData<int>(10); //创建数组a
  5. ind = getRandData<int>(10); //创建数组ind
  6. /*
  7. 下面的方法为:对ind数组进行排序,排序的大小按照数组a的大小来。
  8. 最终得到的结果是ind数组的排序数按照a数组值大小的下表排序的
  9. */
  10. sort(ind, ind + 10, [&](int i, int j) -> bool {
  11. return a[i] < a[j];
  12. });
  13. displayData<int>(a, 10);

运行结果:

        a={3,5,4,1,2}

        ind={1,2,3,4,5}

排序之后:

        a={3,5,4,1,2}

        ind={4,5,1,3,2}

二、leetcode的第一题:两数之和

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm> //sort()排序函数的头文件
  4. using namespace std;
  5. /* leetcode:两数之和 */
  6. class Solution1 {
  7. public:
  8. vector<int> twoSum(vector<int>& nums, int target) {
  9. vector<int> ind;
  10. for (int i = 0; i < nums.size(); i++) ind.push_back(i);
  11. sort(ind.begin(), ind.end(), [&](int i, int j)->bool {
  12. return nums[i] < nums[j]; });
  13. int b = 0, e = nums.size() - 1;
  14. while ((e > b)&&(nums[ind[b]] + nums[ind[e]] != target))
  15. {
  16. if (nums[ind[b]] + nums[ind[e]] > target)
  17. e--;
  18. else
  19. b++;
  20. }
  21. vector<int> ret;
  22. if (ind[b] > ind[e])
  23. {
  24. ret.push_back(ind[e]);
  25. ret.push_back(ind[b]);
  26. }
  27. else
  28. {
  29. ret.push_back(ind[b]);
  30. ret.push_back(ind[e]);
  31. }
  32. return ret;
  33. }
  34. };
  35. int main()
  36. {
  37. vector<int> data;
  38. vector<int> ret;
  39. data.push_back(2);
  40. data.push_back(7);
  41. data.push_back(11);
  42. data.push_back(15);
  43. Solution1 s1;
  44. ret = s1.twoSum(data, 9);
  45. cout << "ret:" << ret[0] << " " << ret[1];
  46. return 0;
  47. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/1017440
推荐阅读
相关标签
  

闽ICP备14008679号