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 加油!