• 数据结构 插入排序 计数排序 快速排序 学习笔记


    首先了解一下

    插入排序:

    从第一个元素开始  视前i个元素已经排好序 

    从第i个元素往下找 比第i个元素小的元素:  第j个元素

    找到了第j个元素:遍历前i个元素(从后往前遍历)  直到找到比第j个元素小的元素  将第j个元素插入到这个元素的后面  比第j个元素大的元素整体后移一位  i++

    1. #include
    2. using namespace std;
    3. void InsertSort(int arr[],int nLen)
    4. {
    5. if (arr == NULL || nLen <= 1)
    6. return;
    7. for (int i=1;i
    8. {
    9. int temp = arr[i];
    10. int j = i-1;
    11. while (j >= 0 && arr[j] > temp)
    12. {
    13. arr[j + 1] = arr[j];
    14. j--;
    15. }
    16. arr[j + 1] = temp;
    17. }
    18. }
    19. int main()
    20. {
    21. int arr[10] = { 0,5,8,3,9,1,4,7,3,10 };
    22. InsertSort(arr, 10);
    23. for (int val : arr)
    24. {
    25. cout << val<<" ";
    26. }
    27. return 0;
    28. }

    计数排序:

    首先我们遍历arr  找出最大值Max和最小值Min

    新开辟出一个数组arrtemp用来存arr中的元素出现的次数

    其中 arrtemp的长度为Max-Min+1

    把arrtemp的每一个元素都赋值0

    再次遍历arr  把arr的相关元素信息存到arrtemp中:

    arrtemp的下标代表  arr元素的值-Min 

    arrtemp元素的值代表  当前 值为 (arrtemp元素下标  +Min)  的元素在arr中出现的次数

    遍历计数数组arrtemp  把其中的值再次赋值回到arr

    1. #include
    2. using namespace std;
    3. //重复数据多时:
    4. //用计数排序
    5. void CountSort(int arr[], int nLen)
    6. {
    7. if (arr == NULL || nLen <= 1)
    8. return;
    9. //遍历数组找打最大值和最小值
    10. int Max = arr[0];
    11. int Min = arr[0];
    12. for (int i = 0; i < nLen; i++)
    13. {
    14. if (arr[i] > Max)
    15. {
    16. Max=arr[i];
    17. }
    18. if (arr[i] < Min)
    19. {
    20. Min = arr[i];
    21. }
    22. }
    23. //根据最大值和最下小值 开辟计数数组
    24. int* arrtemp = new int[Max - Min + 1];
    25. //为技术数组中的每一项都赋为0
    26. ::memset( arrtemp,0,sizeof(int)*(Max - Min + 1 ));
    27. //记录arr中每个元素出现的次数 并记录在arrtemp计数数组中
    28. //arr的元素-Min=他在arrtemp中的下标
    29. // arrtemp元素为 在arr中 值为 当前arrtemp的下标的元素 在arr中出现次数
    30. for (int i = 0; i < nLen; i++)
    31. {
    32. arrtemp[arr[i]-Min]++;
    33. }
    34. //重新往arr里赋值 j为下标
    35. int j = 0;
    36. //遍历arrtemp 往arr里放他的下标
    37. for (int i = 0; i < Max - Min + 1; i++)
    38. {
    39. //通过元素个数判断放几次
    40. while (arrtemp[i] != 0)
    41. {
    42. arr[j] = i + Min;
    43. j++;
    44. arrtemp[i]--;
    45. }
    46. }
    47. //释放计数数组
    48. delete arrtemp;
    49. }
    50. int main()
    51. {
    52. int arr[10] = { 0,0,2,2,2,1,4,7,3,10 };
    53. CountSort(arr, 10);
    54. for (int val : arr)
    55. {
    56. cout << val << " ";
    57. }
    58. return 0;
    59. }

    3.快速排序

    这里我们先了解一下思想

    快速排序中用到了二分排序的思想

    挖坑填补法

    首先将首元素定义为标准数

    在条件begin>end下

    循环

    将首元素arr[begin]挖出来   在末尾元素arr[end]往前找比标准数小的元素 

    找到了把找到的元素给坑(arr[begin])

    没找到

    end--

    再从arr[begin]往后找比标准值大的元素

    找到了 填坑 (arr[begin]赋给arr[end])

    没找到

    begin++

    这是一次二分查找

    此时我们的标准值的左面的元素都小与标准值  右边都大于标准值

    我们用递归在将左侧和右侧分别二分查找  最终 数组就被排好序了

    1. #include
    2. using namespace std;
    3. //快速排序
    4. int Partition(int arr[], int begin, int end)
    5. {
    6. //首元素挖坑
    7. int mid=arr[begin];
    8. //首元素为标准值
    9. //遍历 loop
    10. while (begin
    11. {
    12. //在后边往前找比标准值小的
    13. //填入坑
    14. while (begin mid)
    15. {
    16. end--;
    17. }
    18. arr[begin] = arr[end];
    19. //在填入的坑的位置往后找比标准值大的
    20. //填入后边的坑
    21. while (begin < end&&arr[begin] <= mid)
    22. {
    23. begin++;
    24. }
    25. arr[end] = arr[begin];
    26. }
    27. arr[begin] = mid;
    28. return begin;
    29. return mid;
    30. //将标准值返回
    31. }
    32. void QuickSort(int arr[], int begin, int end)
    33. {
    34. if (arr == NULL || begin >=end)
    35. {
    36. return;
    37. }
    38. int mid = Partition(arr,begin,end);
    39. QuickSort(arr, begin, mid - 1);
    40. QuickSort(arr, mid + 1, end);
    41. }
    42. int main()
    43. {
    44. int arr[10] = { 0,0,2,2,2,1,4,7,3,10 };
    45. QuickSort(arr, 0,9);
    46. for (int val : arr)
    47. {
    48. cout << val << " ";
    49. }
    50. return 0;
    51. }
  • 相关阅读:
    Shell-条件控制语句2
    十大排序算法
    【浅学Java】从浏览器中输入一个URL之后,会发生什么?
    打破原则引入SQL,MongoDB到底想要干啥?
    技术分享| anyRTC音视频混流技术解析
    【排序算法】冒泡排序
    【前端验证】通关寄存器与ral_model —— 将寄存器描述由excel格式转为xml格式的脚本
    Android热修复Sophix的使用
    集合Collection
    Kotlin中Any、Nothing、Unit 类型的概念和用法
  • 原文地址:https://blog.csdn.net/van9527/article/details/126146323