个人观点:其实抛开思想从语法上来说,大致分为三种就够了(冒泡排序、插入法排序、折半法排序)
今天在这里我们先讨论前面三种(即冒泡排序)这方面的内容。
喜欢我的内容,记得动动你们的双手,双击点个赞鸭!
一、选择法排序
核心思想:(从小到大排序)外循环对数组中的每一个元素进行逐个选中,在选中某一个元素时以内循环将这个数组余下未排序的最小值找出与之交换。
实现代码:
for (i = 0; i < 9; i++)
{
min = a[i]; //假设当前元素为最小值
m = i; //记录最小值的位置
for (j = i + 1; j < 10; j++)
{
if (a[j] < min)//如果这个元素的值比当前记录的最小值还小就记录这个元素
{
min = a[j]; //记录最小值
m = j; //记录最小值的位置
}
}
//这里跳出内循环后,我们就得到了余下元素里面的最小值
a[m] = a[i]; //将当前元素赋值给拥有最小值的元素
a[i] = min; //将最小值赋值给当前元素,这里我们就达到了交换数据的目的
}
这里我们是假设一个数组a[10],通过外层循环,每次记录当前位置为最小值(为了避免后面元素没有比当前位置元素小时,交换位置步骤之后数据发生错误)以及当前的位置,加以内循环找出当前位置元素及余下未排序的元素中的最小值,进行数据之间的交换,得到有序数列。
至于外循环为什么循环到<9就结束,是为了减少运算。当循环到a[8]时就只余下一项a[9]了,将他们进行比较之后,将较小的赋值给了a[8],a[9]不就理所当然的是最大值了吗?
一个完整的程序:
//这是一个选择排序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j;
int a[10];
int m, n;
printf("为数组赋值:n");
//从键盘为数组元素赋值
for (i = 0; i < 10; i++)
{
printf("a[%d]", i);
scanf("%d", &a[i]);
}
//从小到大排序
for (i = 0; i < 9; i++)
{
m = a[i];
n = i;
for (j = i + 1; j < 10; j++)
{
if (a[j] < m)
{
m = a[j];
n = j;
}
}
//交换两个元素值
a[n] = a[i];
a[i] = m;
}
//输出数组
for ( i = 0; i < 10; i++)
{
printf("%dn",a[i]);
}
system("pause");
return 0;
}
你看,解释的很清楚有木有!
是的话,别忘记了双击鸭!
二、交换法排序
核心思想:依次逐个选中一个元素,将之与后面的每一个数一一比较,如果后面数值比当前元素小就交换数值,直至最后一个数。
实现代码:
for ( i = 0; i < 9; i++)
{
for ( j = i+1; j < 10; j++)
{
if (a[j]<a[i])
{
min=a[j];
a[j]=a[i];
a[i]=min;
}
}
}
同样,这里我们假设了一个a[10],外出循环依次定位每一个元素,在通过一个内层循环与逐个和后面余下的元素进行比较,如果后面元素比当前元素小就交换他们之间的数值,以实现数组从小到大排序。
一个完整的程序:
//这是一个交换排序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, c = 0, n[10];
printf("为元组赋值:n");
for (a = 0; a < 10; a++)
{
printf("请输入n[%d]: n", a);
scanf("%d", &n[a]);
}
//从小到大排序
for (a = 0; a < 10; a++)
{
for (b = 0; b < 10; b++)
{
//交换顺序
if (n[a] < n[b])
{
c = n[a];
n[a] = n[b];
n[b] = c;
}
}
}
//输出有序元组
for (a = 0; a < 10; a++)
{
printf("n[%d]=%dn", a, n[a]);
}
system("pause");
return 0;
}
三、冒泡法排序
核心思路:
小的数据就像水中的气泡总是逐渐上升,大的数据就像石块往下沉,因此称为冒泡排序法。
通过两个循环:外循环控制已排好序的位置,内循环将大数下沉或小数冒泡。
实现代码:
//冒泡排序法(小数冒泡)
for ( i = 0; i < 10; i++)
{
for ( j = 9; j >=i; j--)
{
if (a[j]<a[j-1])
{
//交换两个数组的值
min=a[j];
a[j]=a[j-1];
a[j-1]=min;
//冒泡排序,如果后一个数比前一个数小的话就交换他们之间的顺序
}
}
//每结束一次内循环就将此次循环内进行排序的较小的值向前冒
}
//冒泡排序法(大数下沉)
for (i = 0; i < 10; i++)
{
for ( j = 0; j < 10-i-1; j++)
//这里“j<10-i-1”的含义是减去最后面已经排序的,同时“-1”是因为排序到最后,同前面原理一样,最后一个数不用排列
{
if (a[j]>a[j+1])
{
max=a[j];
a[j]=a[j+1];
a[j+1]=max;
}
}
}
一个完整的程序:
//这是一个冒泡排序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j;
int a[10];
int m;
printf("为数组元素赋值:n");
for (i = 0; i < 10; i++)
{
printf("a[%d]=", i);
scanf("%d", &a[i]);
}
//从小到大排序
for (i = 0; i < 10; i++)
{
for (j = 9; j >= i; j--)
{
if (a[j] < a[j - 1])
{
//交换两个数组元素的值
m = a[j - 1];
a[j - 1] = a[j];
a[j] = m;
}
}
}
//输出数组
for (i = 0; i < 10; i++)
{
printf("a[%d]=%dn", i, a[i]);
}
system("pause");
return 0;
}
okok,今天的讲解就介绍到这里,大家可以关注我期待下一期的更新鸭!
最后,最后最重要的是记得给个双击、双击、双击啊~
欢迎大家关注我的公众号,每期都能给你不一样的收货!
如何在VS code中配置C语言环境mp.weixin.qq.com![2400fc4281b96cb0045d58420937ab76.png](https://i-blog.csdnimg.cn/blog_migrate/6fa7c8559888ee0f44d13d229a3389d6.png)