排序算法

2022/3/27 11:22:40

本文主要是介绍排序算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.冒泡排序(无价值交换影响排序速度)

对存放原始数据的数组,按从前往后的方向进行多次扫描,每次扫描称为一趟。当发现相邻两个数据的次序与排序要求大小次序不符合时,即将这两个数据进行互换。

①屌丝冒泡

void blue_sort(int a[], int n)//屌丝版的冒泡排序;

{
int i, j, temp = 0, count1 = 0, count2 = 0;
for (i = 0; i < n - 1; i++)
{
for (j = i+1; j < n; j++) //每一趟将一个最小的元素放到第一位
{
count1++;//交换次数
if (a[i] > a[j])//若比较后面的小,就将其放到前面
{
count2++;//比较次数
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
printf("%d %d\n", count1, count2);
}

 ②正常冒泡

void blue_sort(int a[], int n)//冒泡排序;

{
int i, j, temp = 0, count1 = 0, count2 = 0,;
for (i = 0; i < n-1 ; i++)
{

for (j = 0; j < n-1-i; j++) //每趟比较将一个最大的数放到正确的位置
{
count1++;//比较次数
if (a[j] > a[j + 1])//将较大的元素往后移动
{
count2++;交换次数
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;

}
}
}
printf("%d %d\n", count1, count2);
}

③优化的冒泡(设立哨兵,当某次比较发现没有进行交换操作,则说明数组已是有序的)

void blue_sort(int a[], int n)//改进的冒泡排序;(比较次数变少,对于排序好的数组不用再进行比较)

{
int i, j, temp = 0, count1 = 0, count2 = 0, flag = 1;//flag为哨兵
for (i = 0; i < n - 1 && flag; i++)
{
flag = 0;//若标志位为0则说明不会再进行外层循环,说明数组已经是排序好的
for (j = n - 1; j > i; j--) //从后往前依次将最小的数放到最前面
{
count1++;//计数器1记录比较次数
if (a[j - 1] > a[j])//如果前者大于后者则交换
{
count2++;//计数器2记录交换次数
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
flag = 1;//说明进行了比较,若内循环没有进行,flag则不会变为1,排序结束
}
}
}
printf("%d %d\n", count1, count2);
}

前两种冒泡效率相同,第三种冒泡的如果序列有序,则比较次数会减少;

(记录每日编程)2022/3/27   加油!



这篇关于排序算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程