• 数组的排序算法


    1.冒泡排序法

    原理如下:每次比较数组中相邻的两个数组元素的值,将较小的数排在较大的数前面,可实现数组元素的从小到大排序;每次将较大的数排在较小的数前面,可实现数组元素从大到小排序。

    1. /**每次比较数组相邻的两个元素,将大的元素放在前面**/
    2. //冒泡排序从小到大
    3. void fun(int arr[],int n) //定义一个数组arr[],次数n;
    4. {
    5. int i,j,temp;
    6. for(i = 0; i < n-1; i++) //比较的次数,
    7. {
    8. for(j = 0; j < n-1-i; j++)//每次需要的比较两个相邻元素的次数
    9. {
    10. if(arr[j] > arr[j+1])
    11. {
    12. temp = arr[j];
    13. arr[j] = arr[j+1];
    14. arr[j+1] = temp;
    15. }
    16. }
    17. }
    18. }
    19. int main(int argc,char *argv[])
    20. {
    21. int i;
    22. int arr[10];
    23. for(i = 0; i < 10; i++)
    24. {
    25. scanf("%d",&arr[i]);
    26. }
    27. fun(arr,10);
    28. for(i = 0; i < 10; i++)
    29. {
    30. printf("%d ",arr[i]);
    31. }
    32. printf("\n");
    33. return 0;
    34. }
    1. /**每次比较数组相邻的两个元素,将大的元素放在前面**/
    2. //冒泡排序从大到小
    3. void fun1(int arr[],int n) //定义一个数组arr[],次数n;
    4. {
    5. int i,j,temp;
    6. for(i = 0; i < n-1; i++) //比较的次数,
    7. {
    8. for(j = 0; j < n-1-i; j++)//每次需要的比较两个相邻元素的次数
    9. {
    10. if(arr[j] < arr[j+1])
    11. {
    12. temp = arr[j];
    13. arr[j] = arr[j+1];
    14. arr[j+1] = temp;
    15. }
    16. }
    17. }
    18. }
    19. int main(int argc,char *argv[])
    20. {
    21. int i;
    22. int arr[10];
    23. for(i = 0; i < 10; i++)
    24. {
    25. scanf("%d",&arr[i]);
    26. }
    27. fun1(arr,10);
    28. for(i = 0; i < 10; i++)
    29. {
    30. printf("%d ",arr[i]);
    31. }
    32. printf("\n");
    33. return 0;
    34. }

    2.选则排序法

    原理如下:每次在待排序的数组中查找到最大或最小的数组元素,将其值与最前面没有进行过排序的数组元素的值交换;

    1. #include <stdio.h>
    2. /**选择排序从小到大排序**/
    3. int main(int argc, char* argv[])
    4. {
    5. int i, j=0, temp;
    6. int arr[5] = { 5,3,4,1,2 };
    7. for (i = 0; i< 4; i++)
    8. {
    9. for (j = i + 1; j < 5; j++)
    10. {
    11. if (arr[i] > arr[j])
    12. {
    13. temp = arr[i];
    14. arr[i] = arr[j];
    15. arr[j] = temp;
    16. }
    17. }
    18. }
    19. for (i = 0; i < 5; i++)
    20. {
    21. printf("%d ", arr[i]);
    22. }
    23. return 0;
    24. }

    4.快速排序法

    原理:从冒泡排序演变来的算法,使用了分治法,

    首先确定数组元素第一个位置的元素为基准元素。

    第一个元素的位置为L。最后一个元素的位置为R。

    先用基准元素从右往左遍历,如果大于就交换,没有大于,R--;

    再用基准元素从左往右遍历,如果大于于就交换,没有大于,L++;

    最后插入基准值;

    在对左右部分重复上述步骤;

    1. void fun(int arr[],int start,int end)
    2. {
    3. if(start >= end)
    4. {
    5. return;
    6. }
    7. int left = start; //定义一个指向数组第一个元素的指针
    8. int right = end; //定义一个指向数组最后一个元素的指针
    9. int pivot = arr[left]; //取出一个基准值,一般为数组第一个值
    10. while(left < right) //左边元素的指针必须小于右边元素的指针
    11. {
    12. /**右边放左边**/
    13. while(arr[right] > pivot && left < right) //如果右边的位置的值大于基准值,并且左边指针小于右边指针
    14. {
    15. right--; //直到右边位置的值小于或者等于基准值,不再 -
    16. }
    17. if(right > left )
    18. {
    19. arr[left] = arr[right];
    20. left++;
    21. }
    22. /**左边放右边**/
    23. while(arr[left] < pivot && left < right)
    24. {
    25. left++;
    26. }
    27. if(left < right)
    28. {
    29. arr[right] = arr[left];
    30. right--;
    31. }
    32. }
    33. arr[left] = pivot; //将基准值插入中间,现在leftright 都指向基准值的指针
    34. fun(arr,start,left - 1); //重新排序基准左边
    35. fun(arr,right+1,end); //重新排序基准值右边
    36. }
    37. int main(int argc,char *argv[])
    38. {
    39. int i;
    40. int arr[5] = {3,1,2,5,4};
    41. fun(arr,0,sizeof(arr)/sizeof(arr[0]));
    42. for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
    43. {
    44. printf("%d ",arr[i]);
    45. }
    46. printf("\n");
    47. return 0;
    48. }

    3.插入排序法

    5.希尔排序

    6.归并排序

    6.排序算法的比较

  • 相关阅读:
    Postman接口Mock Server服务器设置
    linux修改root密码
    Vue实现数据双向绑定代码
    vue3中父组件与子组件的通信传值
    《视觉SLAM十四讲》-- 建图
    3D打印:FDM打印湿度对打印件及打印机的影响和调整
    3559. 围圈报数
    JavaScript单例模式
    Vue前端框架搭建
    [python][学习]认识元组
  • 原文地址:https://blog.csdn.net/weixin_51310062/article/details/137971236