排序算法是在很多语言中都是一个不可或缺的算法,十分基础有十分经典,而排序算法有分为很多种,我目前掌握的有以下几种:冒泡法,选择法,插入法,和希尔法。这几种算法理解程度是从易到难的,但是这几个算法中最好用的也是计算次数应该是这几个当中最小的,效率最高的,但是他也很考验你对他的理解,需要考验你的分组什么的,也是十分棘手的,但这也是我最喜欢的排序算法,由于还没有完全掌握,所以这篇篇文章暂时不对这个展开讨论。这篇文章我们主要围绕冒泡和选择两种我掌握的好一点的算法开始。
- 冒泡排序
首先是最容易理解的冒泡排序法,也是我最开始接触到的排血算法。它的核心内容是把每一个数与它后面的数比较,如果比他大,则交换位置,一直循环完所要比较的数,最后输出排序内容就是想要的结果。
下面是代码:
#include<stdio.h>
int main()
{
int i, a[10], j, tem;//这里主要是设置十个数的排序做个例子
for (i = 0; i < 10; i++)//输入所要排序的十个数
scanf_s("%d", &a[i]);
for (j = 0; j < 9; j++)//这里只进行九次循环的原因是每一个数都要和后面的数比较,
{//要想得到真正的排好序的数列,要排序n-1次,
for (i = 0; i < 9 - j; i++)//这里的第二层循环是每一个数都要和后面的数作比较,当第一次循环完后
//最大的数就被派到了最后,一次循环排好一个数,以此类推,九次排号就个数,最后一个自然归位了。
{
if (a[i] > a[i + 1])
{
tem = a[i];
a[i] = a[i + 1];
a[i + 1] = tem;//这里依靠中间量tem对两个数进行转变
}
}
}
for (i = 0; i < 10; i++)//输出十个数
printf("%d ", a[i]);
return 0;
}
这是改良版的,可以设置排序任意个数,改变N的大小即可。
#include<stdio.h>
#define N 10
int main()
{
int i, a[N], j, tem;//这里主要是设置十个数的排序做个例子
for (i = 0; i < N; i++)//输入所要排序的十个数
scanf_s("%d", &a[i]);
for (j = 0; j < N-1; j++)//这里只进行九次循环的原因是每一个数都要和后面的数比较,
{//要想得到真正的排好序的数列,要排序n-1次,
for (i = 0; i < N-1 - j; i++)//这里的第二层循环是每一个数都要和后面的数作比较,当第一次循环完后
//最大的数就被派到了最后,一次循环排好一个数,以此类推,九次排号就个数,最后一个自然归位了。
{
if (a[i] > a[i + 1])
{
tem = a[i];
a[i] = a[i + 1];
a[i + 1] = tem;//这里依靠中间量tem对两个数进行转变
}
}
}
for (i = 0; i < N; i++)//输出十个数
printf("%d ", a[i]);
return 0;
}
冒泡排序是最容易理解的排序算法,但是他的缺点也很明显,那就是算法次数巨大,不利于较大的数据处理。
- 选择排序
选择排序同样也是一个比较容易理解的排序算法。他的原理是将数据中的所有数据都与本次循环的第一个数比较,如果比第一个数小则交换。直至循环完所有数。
下面是他的源代码:
#include<stdio.h>
#define N 10
int main()
{
int i, a[N], j, tem;//这里主要是设置十个数的排序做个例子
for (i = 0; i < N; i++)//输入所要排序的十个数
scanf_s("%d", &a[i]);
int min=0;
for (i = 0; i < N - 1; i++)
{
int min = i;//将每一次循环的开始值都设为min
for (j = i + 1; j < N; j++)//每一次比较都要从该数后面的一个数开始到最后一个数结束
//每一次外循环后都会减少一个内循环
if (a[i] > a[j])min = j;
{
tem = a[i];
a[i] = a[min];
a[min] = tem;
}
}
for (i = 0; i < N; i++)//输入所要排序的十个数
printf("%d", a[i]);
return 0;
}
选择排序其实与冒泡排序的方法差不多,区别差异不大。最特别的是希尔排序,我要抓紧时间搞懂。加油!
这是第一天码字,很生疏,居然就两篇文章从12点打到两点了,有点累但是心中充满希望,加油吧,少年!
作于2021年11月15日凌晨2:09
中南林桃园