zoukankan      html  css  js  c++  java
  • 47 排序

    1,排序,排序也称排序算法,排序是将一组数据,按照指定的顺序进行排列的过程

    2,排序的分类:

      ①内部排序:指将需要处理的所有数据都加载到内部存储器(内存)中进行排序

      ②外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序

    3,冒泡排序

      ①基本思想:通过对排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的旗袍一样逐渐向上冒。

      ②因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志 flag 判断元素是否进行过交换,从而减少不必要的比较。

    4,将5个无序的数   3,9,-1,10,-2   使用冒泡排序将其排成一个从小到大的有序数列

      ①分析

        第一轮

         3  9  -1  10  -2

         3  -1  9  10  -2

         3  -1  9  10  -2

         3  -1  9  -2  10    //第一大的数移到最后

        第二轮

         -1   3  9  -2  10

         -1   3  9  -2  10

         -1   3  -2  9  10  //第二大的数就位

        第三轮

          -1  3  -2  9  10

          -1 -2   3  9  10  // 第三大的数就位

        第四轮

           -2  -1  3  9  10   // 全部就位

      ②先进行第一轮比较

     1 #include<stdio.h>
     2 
     3 void main() {
     4     int arr[] = { 3,9,-1,10,-2 };
     5     //第一轮比较,需要比较4次
     6     for (int i = 0;i < 4;i++) {
     7         if (arr[i] > arr[i + 1]) {
     8             int temp = 0;
     9             temp = arr[i];
    10             arr[i] = arr[i + 1];
    11             arr[i + 1] = temp;
    12         }
    13     }
    14     
    15 
    16     //for循环遍历打印
    17     for (int i = 0;i <5;j++) {
    18         printf("%d  ", arr[i]);
    19     }
    20     
    21 }

    打印结果:  3  -1  9  -2  10

      ③依次进行第 2 3 4轮比较

     1 #include<stdio.h>
     2 
     3 void main() {
     4     int arr[] = { 3,9,-1,10,-2 };
     5 
     6     //第一轮比较,需要比较4次
     7     for (int i = 0;i < 4;i++) {
     8         if (arr[i] > arr[i + 1]) {
     9             int temp = 0;
    10             temp = arr[i];
    11             arr[i] = arr[i + 1];
    12             arr[i + 1] = temp;
    13         }
    14     }
    15     
    16     //第二轮比较,需要比较3次
    17     for (int i = 0;i < 3;i++) {
    18         if (arr[i] > arr[i + 1]) {
    19             int temp = 0;
    20             temp = arr[i];
    21             arr[i] = arr[i + 1];
    22             arr[i + 1] = temp;
    23         }
    24     }
    25 
    26     //第三轮比较,需要比较2次
    27     for (int i = 0;i < 2;i++) {
    28         if (arr[i] > arr[i + 1]) {
    29             int temp = 0;
    30             temp = arr[i];
    31             arr[i] = arr[i + 1];
    32             arr[i + 1] = temp;
    33         }
    34     }
    35 
    36 
    37     //第四轮比较,需要比较1次
    38     for (int i = 0;i < 1;i++) {
    39         if (arr[i] > arr[i + 1]) {
    40             int temp = 0;
    41             temp = arr[i];
    42             arr[i] = arr[i + 1];
    43             arr[i + 1] = temp;
    44         }
    45     }
    46 
    47 
    48     //for循环遍历打印
    49     for (int i = 0;i <5;i++) {
    50         printf("%d  ", arr[i]);
    51     }
    52     
    53 }

       ④因为比较次数依次减少,可以在外层使用一个for 循环,优化代码

     1 #include<stdio.h>
     2 
     3 void main() {
     4     int arr[] = { 3,9,-1,10,-2 };
     5 
     6     for (int j = 4;j > 0;j--) {
     7         //第一轮比较,需要比较4次
     8         for (int i = 0;i < j;i++) {
     9             if (arr[i] > arr[i + 1]) {
    10                 int temp = 0;
    11                 temp = arr[i];
    12                 arr[i] = arr[i + 1];
    13                 arr[i + 1] = temp;
    14             }
    15         }
    16     }
    17     
    18     
    19 
    20     //for循环遍历打印
    21     for (int i = 0;i <5;i++) {
    22         printf("%d  ", arr[i]);
    23     }
    24     
    25 }

    ⑤考虑将冒泡排序封装成函数

     1 #include<stdio.h>
     2 
     3 void bubble(int arr[],int arrlen) {
     4     for (int j = arrlen-1;j > 0;j--) {
     5         //第一轮比较,需要比较4次
     6         for (int i = 0;i < j;i++) {
     7             if (arr[i] > arr[i + 1]) {
     8                 int temp = 0;
     9                 temp = arr[i];
    10                 arr[i] = arr[i + 1];
    11                 arr[i + 1] = temp;
    12             }
    13         }
    14     }
    15 }
    16 
    17 
    18 void main() {
    19     int arr[] = { 3,9,-1,10,-2 };
    20     int arrlen = sizeof(arr) / sizeof(int);
    21     
    22     bubble(arr, arrlen);
    28 
    29     //for循环遍历打印
    30     for (int i = 0;i <arrlen;i++) {
    31         printf("%d  ", arr[i]);
    32     }
    33     
    34 }

    当改变数组,如 { 2,5,8,10,9,4} 这个数组排序使,直接调用即可

     1 #include<stdio.h>
     2 
     3 void bubble(int arr[],int arrlen) {
     4     for (int j = arrlen-1;j > 0;j--) {
     5         //第一轮比较,需要比较4次
     6         for (int i = 0;i < j;i++) {
     7             if (arr[i] > arr[i + 1]) {
     8                 int temp = 0;
     9                 temp = arr[i];
    10                 arr[i] = arr[i + 1];
    11                 arr[i + 1] = temp;
    12             }
    13         }
    14     }
    15 }
    16 
    17 
    18 void main() {
    19     int arr[] = { 2,5,8,10,9,4 };
    20     int arrlen = sizeof(arr) / sizeof(int);
    21     
    22     bubble(arr, arrlen);
    23     
    24     //for循环遍历打印
    25     for (int i = 0;i <arrlen;i++) {
    26         printf("%d  ", arr[i]);
    27     }
    28     
    29 }

     

          

  • 相关阅读:
    mongodb单机搭建
    zeus部署
    hive单机部署
    datax部署
    hadoop/hbase/hive单机扩增slave
    读取Jar中的json文件
    Mybatis 一对多 简单映射配置
    java/kotlin 读取文件、写入文件
    ES6中Json、String、Map、Object之间的转换
    java 客户端发起http请求2
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/12359726.html
Copyright © 2011-2022 走看看