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 }

 

      

猜你喜欢

转载自www.cnblogs.com/shanlu0000/p/12359726.html
47