#include<stdio.h>
#include<stdlib.h>
/*
shaker 排序法-改良的冒泡排序
采用双向进行:
先让气泡排序由左向右进行,再来让气泡排序由右往左进行 ,如此完成一次排序的动作,
而您必须使用left与right两个旗标来记录左右两端已排序的元素位置。
如:一个排序的例子如下所示:
排序前:45 19 77 81 13 28 18 19 77 11
往右排序:19 45 77 13 28 18 19 77 11 [81]
向左排序:[11] 19 45 77 13 28 18 19 77 [81]
往右排序:[11] 19 45 13 28 18 19 [77 77 81]
向左排序: [11 13] 19 45 18 28 19 [77 77 81]
往右排序: [11 13] 19 18 28 19 [45 77 77 81]
向左排序: [11 13 18] 19 19 28 [45 77 77 81]
往右排序: [11 13 18] 19 19 [28 45 77 77 81]
向左排序: [11 13 18 19 19] [28 45 77 77 81]
如上所示,括号中表示左右两边已排序完成的部份,当left > right时,则排序完成。
*/
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void Shake_bubsort(int *num, int N)
{
int i, j;
int count = 1;
int left = 0;
int right = N - 1;
for (i = 0; i < N ; i++)
{
for (j = left; j <= right-1; j++)
{
if (num[j] > num[j + 1])
{
swap(num[j], num[j + 1]);
}
}
for (j = right; j >= left + 1; j--)
{
if (num[j] < num[j - 1])
swap(num[j], num[j - 1]);
}
right--;
left++;
if (right < left)
break;
printf("%d次:", count++);
for (int k = 0; k < N; k++)
{
printf("%d ", num[k]);
}
printf("\n");
}
}
int main()
{
int num[10] = { 45, 19, 77, 81, 13, 28, 18, 19, 77, 11 };
Shake_bubsort(num, 10);
system("pause");
return 0;
}
shaker 排序法 - 改良的冒泡排序(C)
最新推荐文章于 2022-08-12 19:23:39 发布