算法代码及其实现
冒泡排序
就是相邻两个数互相比较,(第一个1元素和第2个元素相比,2和3比,3和4比…以此类推)前面的数如果大于后面的,则互换位置;否则不做变化
#include<stdio.h>
int main()
{
int n[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1,};//定义一个大小为10的数组
int i, j,k,temp;
for (i = 1; i < 10; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
{
for (j = 0; j < 10 - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
{
if (n[j] > n[j + 1])//相邻两个数如果逆序,则交换位置
{
temp = n[j];
n[j] = n[j + 1];
n[j + 1] = temp;
}
}
printf("第%d趟排序完成后的数据排序:\n",i);
for (k = 0;k < 10; k++)
{
printf("%-4d", n[k]); //输出左对齐,每个元素占4位的大小
}
printf("\n");
}
printf("\n\n\n");
printf("排序过后的数顺序:\n");
for (i = 0; i < 10; i++)
{
printf("%-4d", n[i]);
}
printf("\n");
return 0;
}
第一轮的比较过程
优化算法
上面的算法是大部分教材中提供的算法,其中有一点是可以优化的:当比较到第 i 轮的时候,如果剩下的元素已经排序好了,那么就不用再继续比较了,跳出循环即可,这样就减少了比较的次数,提高了执行效率。
未经优化的算法一定会进行 n-1 轮比较,经过优化的算法最多进行 n-1 轮比较,高下立判。
优化后的算法实现如下所示:
#include<stdio.h>
int main()
{
int n[10] = {10, 79, 18, 44, 53, 12, 18, 47, 96, 175, };//定义一个大小为10的数组
int i, j, temp, isSorted;
for (i = 1; i < 10; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
{
isSorted = 1; //假设剩下的元素已经排序好了
for (j = 0; j < 10 - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
{
if (n[j] > n[j + 1])//相邻两个数如果逆序,则交换位置
{
temp = n[j];
n[j] = n[j + 1];
n[j + 1] = temp;
isSorted = 0; //一旦需要交换数组元素,就说明剩下的元素没有排序好
}
}
if(isSorted)
break; //如果没有发生交换,说明剩下的元素已经排序好了
}
for (i = 0; i < 10; i++)
{
printf("%-4d", n[i]);
}
printf("\n");
return 0;
}