• 关于冒泡排序算法的实验


      在数据量比较少的应用场景,所有的排序算法的时间差异是比较小的,冒泡排序可能是经常用于处理小数据量的排序算法,冒泡排序的时间复杂度为 O(n²),但是写法不一样,效果还是大相径庭。

      1.C语言的冒泡排序和选择排序的实例:

    1. #include
    2. int main(){
    3. int arr[] = {986,89,56,2,78,8,23,47,36,98,3,876,234};
    4. int temp, i, j, total;
    5. int len = (unsigned)sizeof(arr)/sizeof(arr[0]);
    6. printf("原始数据:\n");
    7. for(i = 0; i < len; i++){
    8. printf("%d ", arr[i]);
    9. }
    10. printf("\n\n");
    11. //1.-------------------------------
    12. printf("1.冒泡排序方法1:\n");
    13. int arr_1[len];
    14. for(i = 0;i < len;i++){
    15. arr_1[i] = arr[i];
    16. }
    17. total = 0;
    18. //1.冒泡排序(注意细节,这里使用 i < len,j < len - 1)
    19. for(i = 0;i < len; i++){
    20. for(j = 0; j < len - 1; j++){
    21. if(arr_1[j] > arr_1[j + 1]){
    22. temp = arr_1[j];
    23. arr_1[j] = arr_1[j + 1];
    24. arr_1[j + 1] = temp;
    25. }
    26. total++;
    27. }
    28. }
    29. for(i = 0; i < len; i++){
    30. printf("%d ", arr_1[i]);
    31. }
    32. printf("\n循环次数:%d\n", total);
    33. //2.-------------------------------
    34. printf("\n\n2.冒泡排序方法2:\n");
    35. int arr_2[len];
    36. for(i = 0;i < len;i++){
    37. arr_2[i] = arr[i];
    38. }
    39. total = 0;
    40. //2.冒泡排序(注意细节,这里使用 i < len - 1,j < len - 1)
    41. for(i = 0;i < len - 1; i++){
    42. for(j = 0; j < len - 1; j++){
    43. if(arr_2[j] > arr_2[j + 1]){
    44. temp = arr_2[j];
    45. arr_2[j] = arr_2[j + 1];
    46. arr_2[j + 1] = temp;
    47. }
    48. total++;
    49. }
    50. }
    51. for(i = 0; i < len; i++){
    52. printf("%d ", arr_2[i]);
    53. }
    54. printf("\n循环次数:%d\n", total);
    55. //3.-------------------------------
    56. printf("\n\n3.冒泡排序方法3:\n");
    57. int arr_3[len];
    58. for(i = 0;i < len;i++){
    59. arr_3[i] = arr[i];
    60. }
    61. total = 0;
    62. //3.冒泡排序(注意细节,这里使用 i < len,j < (len - i - 1))
    63. for(i = 0;i < len; i++){
    64. for(j = 0; j < (len - i - 1); j++){
    65. if(arr_3[j] > arr_3[j + 1]){
    66. temp = arr_3[j];
    67. arr_3[j] = arr_3[j + 1];
    68. arr_3[j + 1] = temp;
    69. }
    70. total++;
    71. }
    72. }
    73. for(i = 0; i < len; i++){
    74. printf("%d ", arr_3[i]);
    75. }
    76. printf("\n循环次数:%d\n", total);
    77. //4.-------------------------------
    78. printf("\n\n4.冒泡排序方法4(得到错误结果):\n");
    79. int arr_4[len];
    80. for(i = 0;i < len;i++){
    81. arr_4[i] = arr[i];
    82. }
    83. total = 0;
    84. //4.冒泡排序(注意细节,这里使用 i < len,j < (len - i))
    85. for(i = 0;i < len; i++){
    86. for(j = 0; j < (len - i); j++){
    87. if(arr_4[j] > arr_4[j + 1]){
    88. temp = arr_4[j];
    89. arr_4[j] = arr_4[j + 1];
    90. arr_4[j + 1] = temp;
    91. }
    92. total++;
    93. }
    94. }
    95. for(i = 0; i < len; i++){
    96. printf("%d ", arr_4[i]);
    97. }
    98. printf("\n循环次数:%d\n", total);
    99. //5.-------------------------------
    100. printf("\n\n5.选择排序:\n");
    101. int arr2[len];
    102. for(i = 0;i < len;i++){
    103. arr2[i] = arr[i];
    104. }
    105. total = 0;
    106. //5.选择排序
    107. for(i = 0;i < len - 1; i++){
    108. for(j = i + 1; j < len; j++){
    109. if(arr2[i] > arr2[j]){
    110. temp = arr2[i];
    111. arr2[i] = arr2[j];
    112. arr2[j] = temp;
    113. }
    114. total++;
    115. }
    116. }
    117. for(i = 0; i < len; i++){
    118. printf("%d ", arr2[i]);
    119. }
    120. printf("\n循环次数:%d\n", total);
    121. }

     

    2.执行后的效果,自已去比对:

    80bd7ad94d17411ab69a7051902783b3.png

     

    3.根据实验,最优的冒泡排序算法应该是:

    1. //待排序数组
    2. int arr[] = {89, 23, 5, 98};
    3. int i, j, temp, len;
    4. len = sizeof(arr)/sizeof(arr[0]);
    5. for(i = 0; i < len; i++){
    6. for(j = 0; j < (len - i - 1); j++){
    7. if(arr[j] > arr[j + 1]){
    8. temp = arr[j];
    9. arr[j] = arr[j + 1];
    10. arr[j + 1] = temp;
    11. }
    12. }
    13. }

      其实上面的冒泡排序算法还可以继续优化,如果检测到排序中一个循环里没有数据交换,就应该立即跳出所有循环,程序没有必要继续傻跑。

     

     

  • 相关阅读:
    Win10怎么快速删除超大数量文件群
    JavaScript:实现二维向量以及各种向量操作算法(附完整源码)
    【星球】【slam】 研讨会(5)VINS:Mono+Fusion 重点提炼
    【Linux---05】虚拟机的网络配置 「设置虚拟机网段 | 设置静态IP | 修改主机名 并 建立IP与主机名的映射」
    Maven依赖解决
    随机数漫谈
    Jmeter二次开发实现rsa加密
    Linux入门教程:P14->进程管理类
    万应案例精选|抓紧抓实抓细,万应为安全生产全域监管护航
    《Datawhale项目实践系列》发布!
  • 原文地址:https://blog.csdn.net/dai510131/article/details/126688498