日期:2014-05-16 浏览次数:20928 次
很久很久以前,曾经写了个blog:冒泡排序 Linux下c 实现 . ,这次再show个冒泡排序的变种:鸡尾酒排序。 鸡尾酒排序在排序时,从两个方向在序列中排序。先找到最大的数字放到最后一位,然后找到最小的数字,放到第一位;然后再找到第二大的数字放到倒数第二位,再找到第二小的数字放到第二位。以此类推,直到完成排序。详细实现,请参阅下面的关键代码:
1、排序头文件:cocktailSort.h
#ifndef COCKTAILSORT_H #define COCKTAILSORT_H #include<stdbool.h> extern void cocktailSort(int * pArr, int length); #endif
      2、排序源文件:cocktailSort.c
#include "cocktailSort.h"
void cocktailSort(int * pArr, int length)
{
        int bottom = 0;
        int top = length-1;
        bool swapped = true;
        int tmp,i;
        while(swapped)
        {
                swapped = false;
                for(i=bottom; i<top; i++)
                {
                        if(*(pArr+i)>*(pArr+i+1))
                        {
                                swapped =true;
                                tmp = *(pArr+i);
                                *(pArr+i)=*(pArr+i+1);
                                *(pArr+i+1)=tmp;
                        }
                }
                top--;
                for(i=top; i>bottom; i--)
                {
                        if(*(pArr+i)<*(pArr+i-1))
                        {
                                swapped = true;
                                tmp = *(pArr+i);
                                *(pArr+i)=*(pArr+i-1);
                                *(pArr+i-1)=tmp;
                        }
                }
                bottom++;
        }
}
3、main函数头文件:main.h
#ifndef MAIN_H #define MAIN_H #include<stdio.h> #include "cocktailSort.h" extern void outputArr(const int *pArr, int lenght); extern int main(void); #endif
         3、main函数源文件:main.c
#include "main.h"
int main(void)
{
        printf("input array length:\n");
        int length;
        scanf("%d", &length);
        if(length<0)
        {
                printf("array length must be larger 0\n");
                return 1;
        }
        printf("array lenght is %d \n", length);
        int arr[length];// ={1, 3, 6,5, 4};
        int i=0;
        for(i=0;i<length;i++)
        {
                printf("input arr[%d] value\n",i);
                scanf("%d", &arr[i]);
        }
        printf("orig array:");
        outputArr(arr, length);
        cocktailSort(arr,length);
        printf("cocktail sort array:");
        outputArr(arr, length);
        return 0;
}
void outputArr(const int *pArr, int length)
{
        int i;
        for(i=0;i<length;i++)
        {
                printf(" %d",*(pArr+i));
        }
        printf("\n");
}
             4、Makefile文件:Makefile
all: main
main: main.o cocktailSort.o 
        gcc -o main main.o cocktailSort.o
main.o: main.c cocktailSort.c cocktailSort.h 
        gcc -c main.c
cocktailSort.o: cocktailSort.c cocktailSort.h
        gcc -c cocktailSort.c
clean:
        @echo "start cleaning"
        -rm main *.o
        @echo "clean completed" 
.PHONY: clean
            5、编译
make
            如果不出意外,可以看到可执行文件main。然后执行可执行文件,如下所示:
[root@localhost sort]$ ./main 
input array length:
5
array lenght is 5 
input arr[0] value
34
input arr[1] value
67
input arr[2] value
89
input arr[3] value
4
input arr[4] value
3