排序算法是算法里面的基础,算法主要是考验思维,在这里会介绍三个简单的算法:直接插入排序,选择排序,冒泡排序。
直接插入排序
直接插入排序经过 n-1 次循环将需要排序的元素排序好,每一次循环依次添加一个后面的新元素到前面排好序的元素中,时间复杂度为(n^2)。代码如下
/*
直接插入排序
参数:需要排序的数组,数组中元素的个数
返回值:无
*/
void Zhi_Jie(int a[],int num)
{
int n,m,z,k;
for(n = 0;n < num;n++)
{
z = a[n];
m = n-1;
while((m >= 0) && (z < a[m]))
{
// a[m+1] = a[m--];//方法一,一步到位,让人看得更加清楚,下面是分解的写法
k = a[m+1];
a[m+1] = a[m];
a[m] = k;
m--;
}
a[m+1] = z;//找到了要插入的位置
}
}
选择排序:
选择排序也是经过n-1次循环将需要排序的元素排序好,每一次循环是寻找后面元素中最小/最大的元素,插入到前面排好序的后面,时间复杂度为(n^2)。代码如下
/*
选择排序实现排序
参数:需要排序的数组,数组中元素的个数
返回值:无
*/
void Xuan_Ze(int a[],int num)
{
int m,n,z,k;
for(m = 0;m < num-1;m++)
{
z = m;
for(n = m+1;n < num;n++)
if(a[z] > a[n])
z = n;
if(m != z)//标志位发生了变换,说明大小发生的改变
{
k = a[z];
a[z] = a[m];
a[m] = k;
}
}
}
冒泡排序
冒泡排序也是经过n-1次循环将需要排序的元素排序好,每一次循环找到最大/最小的元素,移动到后面排好序的元素前,时间复杂度为(n^2)。代码如下
/*
冒泡的方法实现排序
参数:需要排序的数组,数组中元素的个数
返回值:无
*/
void Mao_Pao(int a[],int num)
{
int m,n,z;
for(m = 0;m < num;m++)
for(n = m+1;n < num;n++)
if(a[m] > a[n])
{
z = a[m];
a[m] = a[n];
a[n] = z;
}
}
接下来就是主函数的了,代码如下:
#include"stdio.h"
//宏定义数组中元素的个数
#define test_num 5
//这里加上上面写的函数即可。
int main()
{
int a[test_num];
int i;
printf("请输入%d个数字,每输入完一个就回车一次:\n",test_num);
for(i = 0;i < test_num;i++)
{
scanf("%d",&a[i]);
}
printf("你输入的数字是 :");
for(i = 0;i < test_num;i++)
{
printf("%d ",a[i]);
}
printf("\n");
//排序操作
// Mao_Pao(a,test_num);
// Zhi_Jie(a,test_num);
// Xuan_Ze(a,test_num);
printf("排序之后的顺序为 :");
for(i = 0;i < test_num;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}