shaker 排序法

来源:互联网 发布:淘宝详情页制作技巧 编辑:程序博客网 时间:2024/06/15 16:13
#include<stdio.h>#include<stdlib.h>/*shaker 排序法-改良的冒泡排序采用双向进行:先让气泡排序由左向右进行,再来让气泡排序由右往左进行 ,如此完成一次排序的动作,而您必须使用leftright两个旗标来记录左右两端已排序的元素位置。如:一个排序的例子如下所示:排序前: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;}
原创粉丝点击