当前位置:   article > 正文

数据结构之快排算法以及力扣相关例题_力扣快速排序题

力扣快速排序题
  1. #include "stdio.h"
  2. int partition(int *n,int left,int right) {
  3. int t = n[left];
  4. while (left < right) {
  5. while (left<right && n[right]>t) {
  6. right--;
  7. }
  8. n[left] = n[right];
  9. while (left < right && n[left] < t) {
  10. left++;
  11. }
  12. n[right] = n[left];
  13. }
  14. n[left] = t;
  15. return left;
  16. }
  17. void Quick_sort(int *n,int left,int right) {
  18. if (left < right) {
  19. int mid = partition(n,left,right);
  20. Quick_sort(n, left, mid - 1);
  21. Quick_sort(n, mid + 1, right);
  22. }
  23. }
  24. int main() {
  25. int nums_1[] = { 3,2,5,1,7,9,6,0,8,4},size1;
  26. size1 = sizeof(nums_1) / sizeof(nums_1[0]);
  27. Quick_sort(nums_1, 0, size1 - 1);
  28. for (int i = 0; i < size1; i++) {
  29. printf("%d ",nums_1[i]);
  30. }
  31. return 0;
  32. }

例: 将一个数组分割称为左右两部分,两部分均为乱序数组,通过函数嵌套的思想,对剩下的乱序数组进行排序,找到中间mid的位置,继续分割,知道将整个数组排好序为止

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
 

示例 1:

输入:nums = [1,2,3,1]
输出:true
示例 2:

输入:nums = [1,2,3,4]
输出:false
示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true

两种思路解题

法一:

代码较为简单,使用双重for循环,但是时间复杂度较高,O(n²)

  1. bool containsDuplicate(int* nums, int numsSize){
  2. for (int i = 0; i < numsSize; i++) {
  3. for (int j = i + 1; j < numsSize; j++) {
  4. if (nums[i] == nums[j]) {
  5. return true;
  6. }
  7. }
  8. }
  9. return false;
  10. }

法二:

使用快排,先对整个数组进行排序,然后再进行比较,时间复杂度为O(n)

这样排序后相同元素相邻,我们只需要比较相邻元素是否相同即可,可以少一重循环,但排序本身也可能进行循环,所以必须要使用一个简单的排序算法。

  1. int partition(int *n,int left,int right) {
  2. int t = n[left];
  3. while (left < right) {
  4. while (left<right && n[right]>t) {
  5. right--;
  6. }
  7. n[left] = n[right];
  8. while (left < right && n[left] < t) {
  9. left++;
  10. }
  11. n[right] = n[left];
  12. }
  13. n[left] = t;
  14. return left;
  15. }
  16. void Quick_sort(int *n,int left,int right) {
  17. if (left < right) {
  18. int mid = partition(n,left,right);
  19. Quick_sort(n, left, mid - 1);
  20. Quick_sort(n, mid + 1, right);
  21. }
  22. }
  23. bool containsDuplicate(int *n,int size1) {
  24. if (size1 == 0) return false;
  25. int i = 0;
  26. Quick_sort(nums_1, 0, size1 - 1);
  27. while (i < size1 - 1) {
  28. if (nums_1[i] == nums_1[++i]) return true;
  29. }
  30. return false;
  31. }

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

闽ICP备14008679号