快速排序

把数组的第一个数据作为比较的原点,比该数据小的数据排列在左边,比该数据大的数据排列在右边

 

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <malloc.h>

void swap(int *a, int *b)
{
    int c;
    c = *a;
    *a = *b;
    *b = c;
}

void _quick_sort(int array[], int start, int end)
{
    int middle;
    if(start > end)
        return;
    middle = get_middle1(array, start, end);
    //middle = get_middle2(array, start, end);
    _quick_sort(array, start, middle - 1);
    _quick_sort(array, middle + 1, end);
}

int get_middle1(int array[], int start, int end)
{    
    int middle;
    int change = array[start];
    int loop = start + 1, head = 0, tail = end - start;
    //int j = end;
    int *p = malloc(sizeof(int) * (end - start + 1));
    while(loop <= end)
    {
        if(array[loop] < change)
        {
            p[head] = array[loop];
            head ++;
        }
        if(array[loop] > change)
        {
            p[tail] = array[loop];
            tail --;
        }
        loop ++;
    }
    p[head] = change;
    memmove(array + start, p, sizeof(int) * (end - start + 1));
    return start + head;
}

int get_middle2(int array[], int start, int end)
{    
    int middle;
    int change = array[start];
    int i = start;
    int j = end;
    while(i < j)
    {
        while(i < j && array[j] >= change)
            j --;
        if(i < j)
        {
            array[i] = array[j];
            i ++;
        }
        while(i < j && array[i] <= change)
            i ++;
        if(i < j)
        {
            array[j] = array[i];
            j --;
        }
    }
    array[j] = change;
    return j;
}

void quick_sort(int array[], int length)
{
    assert(NULL != array || 0 != length);
    _quick_sort(array, 0, length -1);
}

void test()
{
    int i;
    int array[10] = {1,3,4,5,8,6,7,9,0,2};
    quick_sort(array, 10);
    for(i = 0; i < 10; i ++)
    {
        printf("%d, ", array[i]);
    }
    printf("\n");
}

int main()
{
    test();
}

posted @ 2014-02-28 08:53  程序员大叔的博客  阅读(189)  评论(0编辑  收藏  举报