博文内容:
本讲讲解排序算法里三种基本算法以及它们之间的区别
★博文转载请注明出处。
1. 打擂台算法:
实现步骤:
(1) 确定擂主(首个到场的即为擂主);
(2) 挑战者上台;
(3) 擂主和挑战者比较;挑战者胜的话,挑战者做擂主,否则擂主继续留在台上;
(5) 重复执行(2)~(3) 步骤,直到最后一个挑战者;
(6) 输出最后的擂主。
原理:
打擂台算法的原理是,默认一个值为最大元素,接着与各各元素进行比较,达到寻找最大值的目的
代码实现:
用打擂台法筛选出二维数组的最大值
#include<stdio.h> #include<stdlib.h> int main() { int i, j; int arr[3][3] = { {7,14,15},{14,13,18},{12,19,15} }; int max = arr[0][0];//设置擂主 for (i = 0;i < 3;i++) for (j = 0;j < 3;j++) if (arr[i][j] > max) max = arr[i][j];//比擂主大就交换擂主 printf("请输出最大值为:%d\n", max); return 0; }
运行结果:
2. 冒泡算法实现排序:
冒泡法(也叫做起泡法)基本思路:
每次将相邻的两个数比较,将较小的那个调到前面。如果有6个数:9,8,5,4,2,0,第一次先将最前面的两个数8和9进行对调。第二次将第2个数和第3个数(9和5)进行对调……如此往复五次就可以得到8,5,4,2,0,9的顺序,可以看到:最大的数9已经“沉底”,成为了最下面的一个数,而小的数开始“上升”,经过第一趟(共5次比较与交换),已经把最大的数9放到了它该在的位置。
如此循环往复,不难发现,我们只需要比较五趟,一趟把一个数放在正确的位置上,而每一趟的比较次数随着趟数的增加而减少。
规律:
我们可以根据上面6个数排序的可以拓展得到:如果有n个数,则要进行(n - 1)趟比较。在第一趟比较中要进行(n - 1)次两两比较,在第 j 趟比较中要进行(n - j)次比较。
代码实现:
//冒泡排序 #include<stdio.h> int main() { //先使用数组从终端输入十个数 int a[10]; int i=0,j=0,t=0; printf("请输入您想要排序的数字:\n"); for (i = 0;i < 10;i++) { scanf("%d", &a[i]); } printf("\n"); //排序过程 for (j = 0;j < 9;j++) { for (i = 0;i < 9 - j;i++) { if (a[i] > a[i + 1]) { t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; } } } printf("排序后结果:\n"); //输出十个数 for (i = 0;i < 10;i++) { printf("%d ", a[i]); } return 0; }
运行结果:
打擂与冒泡:
其实指定第一个元素为最大元素的打擂台和冒泡法的原理相似,不过打擂台算法并不改变二维数组,只是通过比较将最大元素进行输出赋值给max。
3. 选择排序
基本思想:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的思想其实和冒泡排序有点类似,都是在一次排序后把最小的元素放到最前面,或者将最大值放在最后面。但是过程不同,冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体的选择,每一趟从前往后查找出无序区最小值,将最小值交换至无序区最前面的位置。
----developer1024
实现过程:
1. 第一轮从下标为 1 到下标为 n-1 的元素中选取最小值,若小于第一个数,则交换
2. 第二轮从下标为 2 到下标为 n-1 的元素中选取最小值,若小于第二个数,则交换
依次类推
动图展示:
动图来自知乎developer1024
红色表示当前最小值,黄色表示已排序序列,绿色表示当前位置。
具体的我们以一组无序数列为例分解说明
来自developer1024
代码实现:
#include <stdio.h> int main() { void sort(int array[],int n); int a[10],i; printf("enter array:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); sort(a,10); printf("The sorted array:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); return 0; } void sort(int array[],int n) { int i,j,k,t; for(i=0;i<n-1;i++)//趟数 { //一趟选出一个最小的数记录 k=i; for(j=i+1;j<n;j++) if(array[j]<array[k]) k=j;//记录下标 t=array[k]; array[k]=array[i]; array[i]=t; } }
运行结果:
4. 对比总结:
冒泡排序是通过相邻的比较和交换
所谓选择排序就是通过对整体的选择,每一趟从前往后查找出无序区最小值,将最小值交换至无序区最前面的位置。
他们都是在一次排序后把最小的元素放到最前面,或者将最大值放在最后面
而打擂台就是选出一个值,再将其他的数依次和它进行比较
后记: