排序算法之鸡尾酒排序

来源:互联网 发布:如何推广淘宝网店 编辑:程序博客网 时间:2024/05/01 05:24

算法描述:

数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。

算法度量:

数据结构: 数组
最差时间复杂度:  O(n^2)
最优时间复杂度: O(n)
平均时间复杂度:   O(n^2)
最佳算法:  No


源码1:完全按照鸡尾酒算法的描述进行实现,实际的循环次数与冒泡算法是一致的


#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <time.h>#include <stdbool.h>void print_ary( int * ary, unsigned int len ){    while( len-- > 0 ) {        printf("%d ", *ary++ );        }    putchar('\n');}void create_rondom_number(int **parray, unsigned int number){    //struct timeval tpstart;//for linux    unsigned int i =0;    if (NULL != *parray)    {        return;    }    *parray = (int *)malloc(sizeof(unsigned int) * number);    (void)memset(*parray, 0, sizeof(unsigned int) * number);        //gettimeofday(&tpstart,NULL); //for linux    srand(time(NULL));//standard c    //srandom(time(NULL));//for linux    //srandom(tpstart.tv_usec);//for linux    for (i=0; i<number; ++i)    {        (*parray)[i] = rand()%number; // range is [0, number-1] //standard c        //(*parray)[i] = random()%number; // range is [0, number-1]//for linux         //(*parray)[i] = random()%(b-a) + a; //range is [a, b)//for linux        //((*parray)[i] = 1 + (int) ((double)number * rand() / (RAND_MAX + 1.0))); // [1, number]//for linux    }}void cocktail_sort(int *list, unsigned int list_length){     unsigned int bottom = 0;    unsigned int top = list_length - 1;    int tmp;    unsigned int i;    unsigned int counter = 0;    while(bottom < top)     {printf("\n1num=%d top=%d bottom=%d\n", top - bottom, top, bottom);        for(i = bottom; i < top; i = i + 1)        {            printf("bottom -> top a[%d] & a[%d](i=%d) ", i, i+1, i);            if(list[i] > list[i + 1])  // test whether the two elements are in the correct order            {                tmp = list[i];                list[i] = list[i+1];                list[i+1] = tmp;                printf("swap ");            }            print_ary(list, list_length);    counter++;        }        // decreases top the because the element with the largest value in the unsorted        // part of the list is now on the position top         top = top - 1; printf("\n2num=%d top=%d bottom=%d\n", top - bottom, top, bottom);        for(i = top; i > bottom; i = i - 1)        {            printf("top -> bottom a[%d] & a[%d](i=%d) ", i, i-1, i);            if(list[i] < list[i - 1])             {                tmp = list[i];                list[i] = list[i-1];                list[i-1] = tmp;                printf("swap ");            }            print_ary(list, list_length);    counter++;        }        // increases bottom because the element with the smallest value in the unsorted         // part of the list is now on the position bottom         bottom = bottom + 1;      }    printf("counter = %d\n", counter);}int main( int argc, char ** argv ){    int *pary = NULL;    if (argc !=2)    {        printf("\nUsage: %s Number\n", argv[0]);         return -1;    }    create_rondom_number(&pary, (unsigned int)atoi(argv[1]));        printf("\nrandom number: ");    print_ary( pary, (unsigned int)atoi(argv[1]) );    printf("\nStart sortting: \n");    cocktail_sort( pary, (unsigned int)atoi(argv[1]));    printf("\nafter sorted: ");    print_ary( pary, (unsigned int)atoi(argv[1]) );        return 0;}


 

运行结果:

C:\WINDOWS\system32\cmd.exe /c bibubble 10

random number: 0 5 6 1 7 6 4 7 0 7

Start sortting:

1num=9 top=9 bottom=0
bottom -> top a[0] & a[1](i=0) 0 5 6 1 7 6 4 7 0 7
bottom -> top a[1] & a[2](i=1) 0 5 6 1 7 6 4 7 0 7
bottom -> top a[2] & a[3](i=2) swap 0 5 1 6 7 6 4 7 0 7
bottom -> top a[3] & a[4](i=3) 0 5 1 6 7 6 4 7 0 7
bottom -> top a[4] & a[5](i=4) swap 0 5 1 6 6 7 4 7 0 7
bottom -> top a[5] & a[6](i=5) swap 0 5 1 6 6 4 7 7 0 7
bottom -> top a[6] & a[7](i=6) 0 5 1 6 6 4 7 7 0 7
bottom -> top a[7] & a[8](i=7) swap 0 5 1 6 6 4 7 0 7 7
bottom -> top a[8] & a[9](i=8) 0 5 1 6 6 4 7 0 7 7

2num=8 top=8 bottom=0
top -> bottom a[8] & a[7](i=8) 0 5 1 6 6 4 7 0 7 7
top -> bottom a[7] & a[6](i=7) swap 0 5 1 6 6 4 0 7 7 7
top -> bottom a[6] & a[5](i=6) swap 0 5 1 6 6 0 4 7 7 7
top -> bottom a[5] & a[4](i=5) swap 0 5 1 6 0 6 4 7 7 7
top -> bottom a[4] & a[3](i=4) swap 0 5 1 0 6 6 4 7 7 7
top -> bottom a[3] & a[2](i=3) swap 0 5 0 1 6 6 4 7 7 7
top -> bottom a[2] & a[1](i=2) swap 0 0 5 1 6 6 4 7 7 7
top -> bottom a[1] & a[0](i=1) 0 0 5 1 6 6 4 7 7 7

1num=7 top=8 bottom=1
bottom -> top a[1] & a[2](i=1) 0 0 5 1 6 6 4 7 7 7
bottom -> top a[2] & a[3](i=2) swap 0 0 1 5 6 6 4 7 7 7
bottom -> top a[3] & a[4](i=3) 0 0 1 5 6 6 4 7 7 7
bottom -> top a[4] & a[5](i=4) 0 0 1 5 6 6 4 7 7 7
bottom -> top a[5] & a[6](i=5) swap 0 0 1 5 6 4 6 7 7 7
bottom -> top a[6] & a[7](i=6) 0 0 1 5 6 4 6 7 7 7
bottom -> top a[7] & a[8](i=7) 0 0 1 5 6 4 6 7 7 7

2num=6 top=7 bottom=1
top -> bottom a[7] & a[6](i=7) 0 0 1 5 6 4 6 7 7 7
top -> bottom a[6] & a[5](i=6) 0 0 1 5 6 4 6 7 7 7
top -> bottom a[5] & a[4](i=5) swap 0 0 1 5 4 6 6 7 7 7
top -> bottom a[4] & a[3](i=4) swap 0 0 1 4 5 6 6 7 7 7
top -> bottom a[3] & a[2](i=3) 0 0 1 4 5 6 6 7 7 7
top -> bottom a[2] & a[1](i=2) 0 0 1 4 5 6 6 7 7 7

1num=5 top=7 bottom=2
bottom -> top a[2] & a[3](i=2) 0 0 1 4 5 6 6 7 7 7
bottom -> top a[3] & a[4](i=3) 0 0 1 4 5 6 6 7 7 7
bottom -> top a[4] & a[5](i=4) 0 0 1 4 5 6 6 7 7 7
bottom -> top a[5] & a[6](i=5) 0 0 1 4 5 6 6 7 7 7
bottom -> top a[6] & a[7](i=6) 0 0 1 4 5 6 6 7 7 7

2num=4 top=6 bottom=2
top -> bottom a[6] & a[5](i=6) 0 0 1 4 5 6 6 7 7 7
top -> bottom a[5] & a[4](i=5) 0 0 1 4 5 6 6 7 7 7
top -> bottom a[4] & a[3](i=4) 0 0 1 4 5 6 6 7 7 7
top -> bottom a[3] & a[2](i=3) 0 0 1 4 5 6 6 7 7 7

1num=3 top=6 bottom=3
bottom -> top a[3] & a[4](i=3) 0 0 1 4 5 6 6 7 7 7
bottom -> top a[4] & a[5](i=4) 0 0 1 4 5 6 6 7 7 7
bottom -> top a[5] & a[6](i=5) 0 0 1 4 5 6 6 7 7 7

2num=2 top=5 bottom=3
top -> bottom a[5] & a[4](i=5) 0 0 1 4 5 6 6 7 7 7
top -> bottom a[4] & a[3](i=4) 0 0 1 4 5 6 6 7 7 7

1num=1 top=5 bottom=4
bottom -> top a[4] & a[5](i=4) 0 0 1 4 5 6 6 7 7 7

2num=0 top=4 bottom=4
counter = 45

after sorted: 0 0 1 4 5 6 6 7 7 7
Hit any key to close this window...

 

源码2:此实现加了一个标志,与冒泡加标志的改进算法原理一样,但是此鸡尾酒加标志的实现并没有比冒泡加标志更优,反而当第一个for循环出现没有交换时,并没有退出循环,还是执行了第二个for循环,而冒泡加标志当遇到没有交换发生时会立马退出。


#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <time.h>#include <stdbool.h>void print_ary( int * ary, unsigned int len ){    while( len-- > 0 ) {        printf("%d ", *ary++ );        }    putchar('\n');}void create_rondom_number(int **parray, unsigned int number){    //struct timeval tpstart;//for linux    unsigned int i =0;    if (NULL != *parray)    {        return;    }    *parray = (int *)malloc(sizeof(unsigned int) * number);    (void)memset(*parray, 0, sizeof(unsigned int) * number);        //gettimeofday(&tpstart,NULL); //for linux    srand(time(NULL));//standard c    //srandom(time(NULL));//for linux    //srandom(tpstart.tv_usec);//for linux    for (i=0; i<number; ++i)    {        (*parray)[i] = rand()%number; // range is [0, number-1] //standard c        //(*parray)[i] = random()%number; // range is [0, number-1]//for linux         //(*parray)[i] = random()%(b-a) + a; //range is [a, b)//for linux        //((*parray)[i] = 1 + (int) ((double)number * rand() / (RAND_MAX + 1.0))); // [1, number]//for linux    }}void cocktail_sort(int *list, unsigned int list_length){     unsigned int bottom = 0;    unsigned int top = list_length - 1;    bool swapped = true;     int tmp;    unsigned int i;    unsigned int counter = 0;    while(swapped == true) // if no elements have been swapped, then the list is sorted    {        swapped = false; printf("\n1num=%d top=%d bottom=%d\n", top - bottom, top, bottom);        for(i = bottom; i < top; i = i + 1)        {            printf("bottom -> top a[%d] & a[%d](i=%d) ", i, i+1, i);            if(list[i] > list[i + 1])  // test whether the two elements are in the correct order            {                tmp = list[i];                list[i] = list[i+1];                list[i+1] = tmp;                printf("swap ");                swapped = true;            }            print_ary(list, list_length);    counter++;        }        // decreases top the because the element with the largest value in the unsorted        // part of the list is now on the position top         top = top - 1; printf("\n2num=%d top=%d bottom=%d\n", top - bottom, top, bottom);        for(i = top; i > bottom; i = i - 1)        {            printf("top -> bottom a[%d] & a[%d](i=%d) ", i, i-1, i);            if(list[i] < list[i - 1])             {                tmp = list[i];                list[i] = list[i-1];                list[i-1] = tmp;                printf("swap ");                swapped = true;            }            print_ary(list, list_length);    counter++;        }        // increases bottom because the element with the smallest value in the unsorted         // part of the list is now on the position bottom         bottom = bottom + 1;      }    printf("counter = %d\n", counter);}int main( int argc, char ** argv ){    int *pary = NULL;    if (argc !=2)    {        printf("\nUsage: %s Number\n", argv[0]);         return -1;    }    create_rondom_number(&pary, (unsigned int)atoi(argv[1]));        printf("\nrandom number: ");    print_ary( pary, (unsigned int)atoi(argv[1]) );    printf("\nStart sortting: \n");    cocktail_sort( pary, (unsigned int)atoi(argv[1]));    printf("\nafter sorted: ");    print_ary( pary, (unsigned int)atoi(argv[1]) );        return 0;}

运行结果:

C:\WINDOWS\system32\cmd.exe /c bibubble1 10

random number: 5 6 4 6 2 9 5 0 8 0

Start sortting:

1num=9 top=9 bottom=0
bottom -> top a[0] & a[1](i=0) 5 6 4 6 2 9 5 0 8 0
bottom -> top a[1] & a[2](i=1) swap 5 4 6 6 2 9 5 0 8 0
bottom -> top a[2] & a[3](i=2) 5 4 6 6 2 9 5 0 8 0
bottom -> top a[3] & a[4](i=3) swap 5 4 6 2 6 9 5 0 8 0
bottom -> top a[4] & a[5](i=4) 5 4 6 2 6 9 5 0 8 0
bottom -> top a[5] & a[6](i=5) swap 5 4 6 2 6 5 9 0 8 0
bottom -> top a[6] & a[7](i=6) swap 5 4 6 2 6 5 0 9 8 0
bottom -> top a[7] & a[8](i=7) swap 5 4 6 2 6 5 0 8 9 0
bottom -> top a[8] & a[9](i=8) swap 5 4 6 2 6 5 0 8 0 9

2num=8 top=8 bottom=0
top -> bottom a[8] & a[7](i=8) swap 5 4 6 2 6 5 0 0 8 9
top -> bottom a[7] & a[6](i=7) 5 4 6 2 6 5 0 0 8 9
top -> bottom a[6] & a[5](i=6) swap 5 4 6 2 6 0 5 0 8 9
top -> bottom a[5] & a[4](i=5) swap 5 4 6 2 0 6 5 0 8 9
top -> bottom a[4] & a[3](i=4) swap 5 4 6 0 2 6 5 0 8 9
top -> bottom a[3] & a[2](i=3) swap 5 4 0 6 2 6 5 0 8 9
top -> bottom a[2] & a[1](i=2) swap 5 0 4 6 2 6 5 0 8 9
top -> bottom a[1] & a[0](i=1) swap 0 5 4 6 2 6 5 0 8 9

1num=7 top=8 bottom=1
bottom -> top a[1] & a[2](i=1) swap 0 4 5 6 2 6 5 0 8 9
bottom -> top a[2] & a[3](i=2) 0 4 5 6 2 6 5 0 8 9
bottom -> top a[3] & a[4](i=3) swap 0 4 5 2 6 6 5 0 8 9
bottom -> top a[4] & a[5](i=4) 0 4 5 2 6 6 5 0 8 9
bottom -> top a[5] & a[6](i=5) swap 0 4 5 2 6 5 6 0 8 9
bottom -> top a[6] & a[7](i=6) swap 0 4 5 2 6 5 0 6 8 9
bottom -> top a[7] & a[8](i=7) 0 4 5 2 6 5 0 6 8 9

2num=6 top=7 bottom=1
top -> bottom a[7] & a[6](i=7) 0 4 5 2 6 5 0 6 8 9
top -> bottom a[6] & a[5](i=6) swap 0 4 5 2 6 0 5 6 8 9
top -> bottom a[5] & a[4](i=5) swap 0 4 5 2 0 6 5 6 8 9
top -> bottom a[4] & a[3](i=4) swap 0 4 5 0 2 6 5 6 8 9
top -> bottom a[3] & a[2](i=3) swap 0 4 0 5 2 6 5 6 8 9
top -> bottom a[2] & a[1](i=2) swap 0 0 4 5 2 6 5 6 8 9

1num=5 top=7 bottom=2
bottom -> top a[2] & a[3](i=2) 0 0 4 5 2 6 5 6 8 9
bottom -> top a[3] & a[4](i=3) swap 0 0 4 2 5 6 5 6 8 9
bottom -> top a[4] & a[5](i=4) 0 0 4 2 5 6 5 6 8 9
bottom -> top a[5] & a[6](i=5) swap 0 0 4 2 5 5 6 6 8 9
bottom -> top a[6] & a[7](i=6) 0 0 4 2 5 5 6 6 8 9

2num=4 top=6 bottom=2
top -> bottom a[6] & a[5](i=6) 0 0 4 2 5 5 6 6 8 9
top -> bottom a[5] & a[4](i=5) 0 0 4 2 5 5 6 6 8 9
top -> bottom a[4] & a[3](i=4) 0 0 4 2 5 5 6 6 8 9
top -> bottom a[3] & a[2](i=3) swap 0 0 2 4 5 5 6 6 8 9

1num=3 top=6 bottom=3
bottom -> top a[3] & a[4](i=3) 0 0 2 4 5 5 6 6 8 9
bottom -> top a[4] & a[5](i=4) 0 0 2 4 5 5 6 6 8 9
bottom -> top a[5] & a[6](i=5) 0 0 2 4 5 5 6 6 8 9

2num=2 top=5 bottom=3
top -> bottom a[5] & a[4](i=5) 0 0 2 4 5 5 6 6 8 9
top -> bottom a[4] & a[3](i=4) 0 0 2 4 5 5 6 6 8 9
counter = 44

after sorted: 0 0 2 4 5 5 6 6 8 9
Hit any key to close this window...

 

源码3:此实现是最优的实现,在加了交换标志的同时,增加了一个边界标志,此边界标志记录了最后一次进行交换的元素位置,表明此位置之前或者之后的所有元素都已经排好序了,不需要再进行排序了,所以在某些情况下可以减少循环的次数。鸡尾酒算法是两头可以加边界标志,而冒泡算法只能在一边加标志,所以边界标志在加在鸡尾酒算法中比在冒泡算法中效率高一倍

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <time.h>#include <stdbool.h>void print_ary( int * ary, unsigned int len ){    while( len-- > 0 ) {        printf("%d ", *ary++ );        }    putchar('\n');}void create_rondom_number(int **parray, unsigned int number){    //struct timeval tpstart;//for linux    unsigned int i =0;    if (NULL != *parray)    {        return;    }    *parray = (int *)malloc(sizeof(unsigned int) * number);    (void)memset(*parray, 0, sizeof(unsigned int) * number);        //gettimeofday(&tpstart,NULL); //for linux    srand(time(NULL));//standard c    //srandom(time(NULL));//for linux    //srandom(tpstart.tv_usec);//for linux    for (i=0; i<number; ++i)    {        (*parray)[i] = rand()%number; // range is [0, number-1] //standard c        //(*parray)[i] = random()%number; // range is [0, number-1]//for linux         //(*parray)[i] = random()%(b-a) + a; //range is [a, b)//for linux        //((*parray)[i] = 1 + (int) ((double)number * rand() / (RAND_MAX + 1.0))); // [1, number]//for linux    }}void cocktail_sort(int *list, unsigned int list_length){     unsigned int bottom = 0;    unsigned int top = list_length - 1;    bool swapped = true;     int tmp;    unsigned int bounder = 0;    unsigned int i;    unsigned int counter = 0;    while(swapped == true) // if no elements have been swapped, then the list is sorted    {        swapped = false; printf("\n1num=%d top=%d bottom=%d\n", top - bottom, top, bottom);        for(i = bottom; i < top; i = i + 1)        {            printf("bottom -> top a[%d] & a[%d](i=%d) ", i, i+1, i);            if(list[i] > list[i + 1])  // test whether the two elements are in the correct order            {                tmp = list[i];                list[i] = list[i+1];                list[i+1] = tmp;                printf("swap ");                swapped = true;bounder = i;            }            print_ary(list, list_length);    counter++;        }        // decreases top the because the element with the largest value in the unsorted        // part of the list is now on the position top         top = bounder; printf("\n2num=%d top=%d bottom=%d\n", top - bottom, top, bottom);        for(i = top; i > bottom; i = i - 1)        {            printf("top -> bottom a[%d] & a[%d](i=%d) ", i, i-1, i);            if(list[i] < list[i - 1])             {                tmp = list[i];                list[i] = list[i-1];                list[i-1] = tmp;                printf("swap ");                swapped = true;bounder = i;            }            print_ary(list, list_length);    counter++;        }        // increases bottom because the element with the smallest value in the unsorted         // part of the list is now on the position bottom         bottom = bounder;      }    printf("counter = %d\n", counter);}int main( int argc, char ** argv ){    int *pary = NULL;    if (argc !=2)    {        printf("\nUsage: %s Number\n", argv[0]);         return -1;    }    create_rondom_number(&pary, (unsigned int)atoi(argv[1]));        printf("\nrandom number: ");    print_ary( pary, (unsigned int)atoi(argv[1]) );    printf("\nStart sortting: \n");    cocktail_sort( pary, (unsigned int)atoi(argv[1]));    printf("\nafter sorted: ");    print_ary( pary, (unsigned int)atoi(argv[1]) );        return 0;}


 

运行结果:

C:\WINDOWS\system32\cmd.exe /c bibubble2 10

random number: 7 8 5 1 6 3 0 9 0 5

Start sortting:

1num=9 top=9 bottom=0
bottom -> top a[0] & a[1](i=0) 7 8 5 1 6 3 0 9 0 5
bottom -> top a[1] & a[2](i=1) swap 7 5 8 1 6 3 0 9 0 5
bottom -> top a[2] & a[3](i=2) swap 7 5 1 8 6 3 0 9 0 5
bottom -> top a[3] & a[4](i=3) swap 7 5 1 6 8 3 0 9 0 5
bottom -> top a[4] & a[5](i=4) swap 7 5 1 6 3 8 0 9 0 5
bottom -> top a[5] & a[6](i=5) swap 7 5 1 6 3 0 8 9 0 5
bottom -> top a[6] & a[7](i=6) 7 5 1 6 3 0 8 9 0 5
bottom -> top a[7] & a[8](i=7) swap 7 5 1 6 3 0 8 0 9 5
bottom -> top a[8] & a[9](i=8) swap 7 5 1 6 3 0 8 0 5 9

2num=8 top=8 bottom=0
top -> bottom a[8] & a[7](i=8) 7 5 1 6 3 0 8 0 5 9
top -> bottom a[7] & a[6](i=7) swap 7 5 1 6 3 0 0 8 5 9
top -> bottom a[6] & a[5](i=6) 7 5 1 6 3 0 0 8 5 9
top -> bottom a[5] & a[4](i=5) swap 7 5 1 6 0 3 0 8 5 9
top -> bottom a[4] & a[3](i=4) swap 7 5 1 0 6 3 0 8 5 9
top -> bottom a[3] & a[2](i=3) swap 7 5 0 1 6 3 0 8 5 9
top -> bottom a[2] & a[1](i=2) swap 7 0 5 1 6 3 0 8 5 9
top -> bottom a[1] & a[0](i=1) swap 0 7 5 1 6 3 0 8 5 9

1num=7 top=8 bottom=1
bottom -> top a[1] & a[2](i=1) swap 0 5 7 1 6 3 0 8 5 9
bottom -> top a[2] & a[3](i=2) swap 0 5 1 7 6 3 0 8 5 9
bottom -> top a[3] & a[4](i=3) swap 0 5 1 6 7 3 0 8 5 9
bottom -> top a[4] & a[5](i=4) swap 0 5 1 6 3 7 0 8 5 9
bottom -> top a[5] & a[6](i=5) swap 0 5 1 6 3 0 7 8 5 9
bottom -> top a[6] & a[7](i=6) 0 5 1 6 3 0 7 8 5 9
bottom -> top a[7] & a[8](i=7) swap 0 5 1 6 3 0 7 5 8 9

2num=6 top=7 bottom=1
top -> bottom a[7] & a[6](i=7) swap 0 5 1 6 3 0 5 7 8 9
top -> bottom a[6] & a[5](i=6) 0 5 1 6 3 0 5 7 8 9
top -> bottom a[5] & a[4](i=5) swap 0 5 1 6 0 3 5 7 8 9
top -> bottom a[4] & a[3](i=4) swap 0 5 1 0 6 3 5 7 8 9
top -> bottom a[3] & a[2](i=3) swap 0 5 0 1 6 3 5 7 8 9
top -> bottom a[2] & a[1](i=2) swap 0 0 5 1 6 3 5 7 8 9

1num=5 top=7 bottom=2
bottom -> top a[2] & a[3](i=2) swap 0 0 1 5 6 3 5 7 8 9
bottom -> top a[3] & a[4](i=3) 0 0 1 5 6 3 5 7 8 9
bottom -> top a[4] & a[5](i=4) swap 0 0 1 5 3 6 5 7 8 9
bottom -> top a[5] & a[6](i=5) swap 0 0 1 5 3 5 6 7 8 9
bottom -> top a[6] & a[7](i=6) 0 0 1 5 3 5 6 7 8 9

2num=3 top=5 bottom=2
top -> bottom a[5] & a[4](i=5) 0 0 1 5 3 5 6 7 8 9
top -> bottom a[4] & a[3](i=4) swap 0 0 1 3 5 5 6 7 8 9
top -> bottom a[3] & a[2](i=3) 0 0 1 3 5 5 6 7 8 9

1num=1 top=5 bottom=4
bottom -> top a[4] & a[5](i=4) 0 0 1 3 5 5 6 7 8 9

2num=0 top=4 bottom=4
counter = 39

after sorted: 0 0 1 3 5 5 6 7 8 9
Hit any key to close this window...

 

参考:

http://baike.baidu.com/view/1981861.htm

http://zh.wikipedia.org/wiki/%E9%B8%A1%E5%B0%BE%E9%85%92%E6%8E%92%E5%BA%8F