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 }