当前位置:   article > 正文

数据结构排序合集(笔记)

数据结构排序合集(笔记)

目录

一.插入排序与希尔排序

二.选择排序与堆排序

三.冒泡排序和快速排序

四.归并排序

五.计数排序


一.插入排序与希尔排序

时间复杂度空间复杂度稳定性
插入排序O(N^2)O(1)稳定
希尔排序O(N^1.3)O(1)不稳定

插入排序: 

希尔排序两个排序的时间复杂度是一样的,即使是四循环,他们效率也相同):


二.选择排序与堆排序

时间复杂度空间复杂度稳定性
选择排序O(N^2)O(1)不稳定
堆排序O(N*logN)O(1)不稳定

  1. void SelectSort(int* a, int n)//选择排序
  2. {
  3. int begin = 0;
  4. int end = n - 1;
  5. while(begin < end)
  6. {
  7. int mini = begin;
  8. int maxi = end;
  9. for (int i = begin; i <= end; i++)//选出最大和最小进行交换
  10. {
  11. if (a[i] < a[mini])
  12. {
  13. mini = i;
  14. }
  15. if (a[i] > a[maxi])
  16. {
  17. maxi = i;
  18. }
  19. }
  20. swap(&a[mini], &a[begin]);
  21. if (begin == maxi)
  22. maxi = mini;
  23. swap(&a[maxi], &a[end]);
  24. end--;
  25. begin++;
  26. }
  27. }

(选择排序是特别慢,也没有稳定性的排序,可能连冒泡都比不过)

堆排序( 因为要排升序,所以建大堆):


三.冒泡排序和快速排序

时间复杂度空间复杂度稳定性
冒泡排序O(N^2)O(1)稳定
快速排序O(N*logN)O(logN)~O(N)不稳定

冒泡排序:

快速排序:

  1. int Getmid(int*a,int left,int right)//三数取中
  2. {
  3. int midi = (left + right) / 2;
  4. if (a[right] > a[left])
  5. {
  6. if (a[midi] > a[right])
  7. {
  8. return right;
  9. }
  10. else if (a[midi] < a[left])
  11. {
  12. return left;
  13. }
  14. else
  15. return midi;
  16. }
  17. else// if (a[left] >= a[right])
  18. {
  19. if (a[midi] > a[left])
  20. {
  21. return left;
  22. }
  23. else if (a[midi] < a[right])
  24. {
  25. return right;
  26. }
  27. else
  28. return midi;
  29. }
  30. }

不用使用递归的qsort(用堆去模拟递归)

  1. void QuickSortNonR(int* a, int left, int right)
  2. {
  3. Stack st;
  4. StackInit(&st);
  5. StackPush(&st, right);
  6. StackPush(&st, left);
  7. while (!StackEmpty(&st))
  8. {
  9. int begin = StackTop(&st);
  10. StackPop(&st);
  11. int end = StackTop(&st);
  12. StackPop(&st);
  13. int keyi = PartSort3(a, begin, end);
  14. if (keyi + 1 < end)
  15. {
  16. StackPush(&st, end);
  17. StackPush(&st, keyi + 1);
  18. }
  19. if (begin < keyi - 1)
  20. {
  21. StackPush(&st, keyi - 1);
  22. StackPush(&st, begin);
  23. }
  24. }
  25. StackDestroy(&st);
  26. }

四.归并排序

时间复杂度空间复杂度稳定性
归并排序O(N*logN)O(logN)稳定

  1. void _MergeSort(int* a, int* tmp, int left,int right)
  2. {
  3. if (left >= right)
  4. return;
  5. int midi = (left + right) / 2;
  6. _MergeSort(a, tmp, left, midi);
  7. _MergeSort(a, tmp, midi+1, right);
  8. //
  9. int begin1 = left, end1 = midi;
  10. int begin2 = midi+1, end2 = right;
  11. int i = left;
  12. while (begin1 <= end1 && begin2 <= end2)
  13. {
  14. if (a[begin1] <= a[begin2])
  15. {
  16. tmp[i++] = a[begin1++];
  17. }
  18. else
  19. {
  20. tmp[i++] = a[begin2++];
  21. }
  22. }
  23. while (begin1 <= end1)
  24. {
  25. tmp[i++] = a[begin1++];
  26. }
  27. while (begin2 <= end2)
  28. {
  29. tmp[i++] = a[begin2++];
  30. }
  31. memcpy(a+left, tmp+left, sizeof(int)*((right - left)+1));
  32. }

非递归实现归并排序:

  1. void MergeSortNonR(int* a, int n)
  2. {
  3. int* tmp = (int*)malloc(n*sizeof(int));
  4. if (tmp == NULL)
  5. {
  6. perror("malloc fail");
  7. return;
  8. }
  9. int gap = 1;
  10. while (gap < n)
  11. {
  12. for (int i = 0; i < n;i += 2*gap)//
  13. {
  14. int begin1 = i, end1 = i + gap - 1;
  15. int begin2 = i + gap, end2 = i + 2 * gap - 1;
  16. int j = i;
  17. //[i,end1] [i+gap,end2]
  18. if (begin2 >= n)
  19. break;
  20. if (end2 >= n)
  21. end2 = n-1;
  22. printf("[%d %d] [%d %d]", begin1, end1, begin2, end2);
  23. while (begin1 <= end1 && begin2 <= end2)
  24. {
  25. if (a[begin1] <= a[begin2])
  26. {
  27. tmp[j++] = a[begin1++];
  28. }
  29. else
  30. {
  31. tmp[j++] = a[begin2++];
  32. }
  33. }
  34. while (begin1 <= end1)
  35. {
  36. tmp[j++] = a[begin1++];
  37. }
  38. while (begin2 <= end2)
  39. {
  40. tmp[j++] = a[begin2++];
  41. }
  42. memcpy(a+i, tmp+i, sizeof(int) * (end2 - i +1));//
  43. }
  44. printf("\n");
  45. gap = 2*gap;
  46. }
  47. free(tmp);
  48. tmp = NULL;
  49. }

五.计数排序

  1. // 计数排序
  2. void CountSort(int* a, int n)
  3. {
  4. int max = a[0], min = a[0];
  5. for (int i = 0; i < n; i++)//选出最大最小得到区间大小
  6. {
  7. if (max < a[i])
  8. max = a[i];
  9. if (min > a[i])
  10. min = a[i];
  11. }
  12. int range = max - min +1 ;
  13. int* count = (int*)calloc(range,sizeof(int));
  14. if (count == NULL)
  15. {
  16. perror("malloc fail");
  17. return;
  18. }
  19. for (int i = 0; i < n; i++)//给新数组进行计数
  20. {
  21. count[a[i] - min]++;
  22. }
  23. int j = 0;
  24. for (int i = 0; i < range; i++)//覆盖旧数组
  25. {
  26. while (count[i]--)
  27. {
  28. a[j++] = i + min;
  29. }
  30. }
  31. free(count);
  32. count = NULL;
  33. }

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

闽ICP备14008679号