小白用c语言编写七大排序(上)方法(?为了让和笔者一样的小白能看懂,笔者注释了很多))

少年乘勇气,百战过乌孙。这篇文章主要讲述小白用c语言编写七大排序(上)方法(?为了让和笔者一样的小白能看懂,笔者注释了很多))相关的知识,希望能为你提供帮助。
输入n,再输入n个数,对n个数进行排序(本文以升序为例,降序反之)
1、冒泡排序?思想:从第一个数开始,利用循环,比较前一个数a[i]和后一个数a[i+1]的大小,如果a[i]> a[i+1],则交换a[i]与a[i+1]的值。最后,使得每次循环的最大值都被交换到了该数列的最后,所以每次循环后最后一个数都是排好了的,即每次循环后还剩余未排序的数n-1,代码如下:

#include < stdio.h> //c语言头文件
int main()//主函数

int n, a[10000],i,j,max; //定义类型
scanf("%d", & n); //输入n,表示接下来需要输入n个数
for (i = 0; i < n; i++)

scanf("%d", & a[i]); //利用for循环,输入n个数,存入数组a[i]

max = a[0]; //首先将数组第一个数a[0]赋给max

for (i = 0; i < n; i++)//第一层循环,表示要排n个数,每个数要排一次

for (j = 0; j < n - i - 1; j++)//第二层循环,表示每排一个数,并且要比较(n-i-1)次
//因为每排完一个数,这个数下一轮就不用排了,还剩下未排完的数的数量就不断-1,再深思一下,很好想的
if (a[j] > a[j+1])//比较前后两个数的大小 ,如果前一个数大于后面一个数,则进入if交换值

max = a[j+1]; //将后一个值赋给一个变量,进行一个值的存储
a[j+1] = a[j]; //将前一个值赋给后一个值
a[j ] = max; //将存储后一个值的变量赋给前一个值,这样就完成交换了


//进行到这里就交换完成了
for (i = 0; i < n; i++)
printf("%d ",a[i]); //最后利用for循环输出数组a[i]

return 0;

?为了让和笔者一样的小白能看懂,笔者注释了很多
其实,上面的代码还不够完美。设想:如果循环进行到某一次的时候,该数列已经排好,但是,上面的代码还是会继续执行下去,这就做了很多无用功,程序跑的慢,用户体验差,所以接下来我们做一个代码上的优化。
冒泡排序优化(一)
#include < stdio.h>
int main()

int n, a[10000],i,j,max;
scanf("%d", & n);
for (i = 0; i < n; i++)

scanf("%d", & a[i]);

max = a[0];
for (i = 0; i < n; i++)

int flag = 0; //立一个flag=0
for (j = 0; j < n - i - 1; j++)

if (a[j] > a[j+1])//如果程序还没排好,则会进入if

max = a[j+1];
a[j+1] = a[j];
a[j ] = max;
flag = 1; //进入if后flag=1


if (flag == 0)//在第二层循环结束后,如果flag还是等于0,则说明没有进入if,即程序已经排好,这时候就可以退出排序了
break; //这样就节省了不必要的时间

for (i = 0; i < n; i++)
printf("%d ",a[i]);

return 0;

【小白用c语言编写七大排序(上)方法(?为了让和笔者一样的小白能看懂,笔者注释了很多))】有些数列,后面很多是有序的,而前面是无序的,这时候我们就不需要再将后面的数据再进行排序,所以,只要我们循环每走一遍并记下该次最后交换值的下标,再轮到下一个循环时,就只进行到上一个被记下的下标为止就好了。这也为程序大大节省了空间。
冒泡排序优化(二)?优化如下:
#include< stdio.h> //冒泡排序优化二
int main()

int n, a[10000], i, j,temp,index_1,index_2;
scanf("%d", & n); //输入n
for (i = 0; i < n; i++)//利用for循环输入n个数存入数组a[i]
scanf("%d", & a[i]);


index_2 = n; //(很关键的一步)1、让index他两都初始化为n
index_1 = index_2; //2、下面存储下标的值赋给index_1,
for (i = 0; i < index_1; i++) //第一层循环

for (j = 0; j < index_1-1; j++)//第二层循环(同冒泡排序)

if (a[j] > a[j + 1])//判断前后两个值的大小

temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp; //到这里与冒泡排序都是一样的,接下来就是区别了(注意)
index_2 = j; //每次交换后,将前一个值的下标(j)进行存储给到index_2


index_1 = index_2+1; //将存储下标的值加1赋给index_1,使它重新开启一个新的循环
i = 0; //开启一个新的循环就要把i重新定为零,程序执行的最后会因为i=1< index_1不成立而结束程序(此时index_1应该是为1)
//到这里就排完了
for (i = 0; i < n; i++)
printf("%d ", a[i]); //利用for输出数组

return 0;

优化一与优化二结合版(其实这里的flag可加可不加,意义不是很大,因为每次循环后index_1的值都会更新一次,不交换其就为1,i=1< index_1不成立就结束循环了,所以这个结合版就随便了解一下,不用太过在意)
#include< stdio.h> //冒泡排序优化二
int main()

int n, a[10000], i, j, temp, index_1, index_2;
scanf("%d", & n); //输入n
for (i = 0; i < n; i++)//利用for循环输入n个数存入数组a[i]
scanf("%d", & a[i]);


index_2 = n; //(很关键的一步)1、让index他两都初始化为n
index_1 = index_2; //2、下面存储下标的值赋给index_1,
for (i = 0; i < index_1; i++) //第一层循环

int flag = 0; //立一个flag=0

for (j = 0; j < index_1 - 1; j++)//第二层循环(同冒泡排序)

if (a[j] > a[j + 1])//判断前后两个值的大小

temp = a[j + 1];
a[j + 1] = a[j];
a[

    推荐阅读