日期:2014-05-16  浏览次数:20703 次

鸡尾酒排序Linux下c 实现

      很久很久以前,曾经写了个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