• 算法总结篇(1)——插入排序、选择排序以及快速排序


    本篇我们复习一下前面我们学习过的排序类型,为后面的学习做些准备。毕竟温故而知新,可以为师矣。

    插入排序

    直接插入排序

    1. void InsertSort(int* a, int n)
    2. {
    3. for (int i = 0;i < n - 1;++i)
    4. {
    5. int end = i;
    6. int tmp = a[end + 1];
    7. while (end >= 0)
    8. {
    9. if (tmp < a[end])
    10. {
    11. a[end + 1] = a[end];
    12. --end;
    13. }
    14. else
    15. {
    16. break;
    17. }
    18. }
    19. a[end + 1] = tmp;
    20. }
    21. }

    希尔排序

    1. void ShellSort(int* a, int n)
    2. {
    3. int gap = n;
    4. while (gap > 1)
    5. {
    6. gap = gap / 3 + 1;
    7. for (int i = 0;i < n - gap;++i)
    8. {
    9. int end = i;
    10. int tmp = a[end + gap];
    11. while (end >= 0)
    12. {
    13. if (tmp < a[end])
    14. {
    15. a[end + gap] = a[end];
    16. end-=gap;
    17. }
    18. else
    19. {
    20. break;
    21. }
    22. }
    23. a[end + gap] = tmp;
    24. }
    25. }
    26. }

    直接插入排序就是gap为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 min = begin;
    8. int max = begin;
    9. for (int i = begin + 1;i <= end;++i)
    10. {
    11. if (a[i] < a[min])
    12. {
    13. min = i;
    14. }
    15. if (a[i] > a[max])
    16. {
    17. max = i;
    18. }
    19. }
    20. Swap(&a[begin], &a[min]);
    21. if (max==begin)//当最大的数字下标为begin,必须让max=min
    22. {
    23. max = min;
    24. }
    25. Swap(&a[end], &a[max]);
    26. ++begin;
    27. --end;
    28. }
    29. }

    堆排序

    1. void AdjustDown(int* a, int size, int parent)
    2. {
    3. int child = parent * 2 + 1;
    4. while (child < size)
    5. {
    6. if (child + 1 < size && a[child] > a[child + 1])
    7. {
    8. ++child;
    9. }
    10. if (a[child] < a[parent])
    11. {
    12. Swap(&a[child], &a[parent]);
    13. parent = child;
    14. child = child * 2 + 1;
    15. }
    16. else
    17. {
    18. break;
    19. }
    20. }
    21. }
    22. void HeapSort(int*a,int n)
    23. {
    24. for (int i = (n - 1 - 1) / 2;i >= 0;--i)
    25. {
    26. AdjustDown(a, n, i);
    27. }
    28. }

    交换排序 

    冒泡排序

    1. void BubbleSort(int* a, int n)
    2. {
    3. for (int j = 0;j < n;j++)
    4. {
    5. for (int i = 0;i <=n - 1 - 1;i++)
    6. {
    7. if (a[i] > a[i + 1])
    8. {
    9. Swap(&a[i], &a[i + 1]);
    10. }
    11. }
    12. }
    13. }

    快速排序

    1. int GetMidi(int* a, int begin, int end)
    2. {
    3. int midi = (begin + end) / 2;
    4. // begin midi end 三个数选中位数
    5. if (a[begin] < a[midi])
    6. {
    7. if (a[midi] < a[end])
    8. return midi;
    9. else if (a[begin] > a[end])
    10. return begin;
    11. else
    12. return end;
    13. }
    14. else // a[begin] > a[midi]
    15. {
    16. if (a[midi] > a[end])
    17. return midi;
    18. else if (a[begin] < a[end])
    19. return begin;
    20. else
    21. return end;
    22. }
    23. }
    24. int PSort(int* a, int begin,int end)
    25. {
    26. int midi = GetMidi(a, begin, end);
    27. Swap(&a[midi], &a[begin]);
    28. int key = begin;
    29. int prev = begin;
    30. int cur = prev + 1;
    31. while (cur <= end)
    32. {
    33. if (a[cur] < a[key] && ++prev != cur)
    34. Swap(&a[cur], &a[prev]);
    35. ++cur;
    36. }
    37. Swap(&a[key], &a[prev]);
    38. key = prev;
    39. return key;
    40. }
    41. void QuickSort(int* a, int begin, int end)
    42. {
    43. if (begin >= end)
    44. return;
    45. int keyi = PSort(a, begin, end);
    46. QuickSort(a, begin, keyi - 1);
    47. QuickSort(a, keyi + 1, end);
    48. }

    快速排序很少用到hoare的方法,都是用的挖坑法和前后指针法。

  • 相关阅读:
    控价与数据分析的关系
    Blazor实战——Known框架增删改查导
    Mysql 三级等保安全加固
    对各种指针,数组的联立回顾复习(字符指针,指针数组,数组指针,函数指针,函数指针数组)
    【剑指offer】二进制中1的个数&&2的幂
    ADPCM(自适应差分脉冲编码调制)的原理和计算
    1 什么是Zookeeper 能干什么
    css 双栏布局 左侧宽度自适应 右侧自适应
    Python 之 基本概述(1)
    C语言进阶第七课-----------自定义类型的讲解(结构体枚举联合)
  • 原文地址:https://blog.csdn.net/gyyz995/article/details/136169166