#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LIST_SIZE 10

void swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;} // x   or may cause error if a = b
void quickSort(int list[], int n);

int conqure(int list[], int l, int r);  // return pivot position


int main()
{
    srand(time(NULL));

    int list[LIST_SIZE];

    list[0] = 0;
    for(int i = 1; i<LIST_SIZE; i++)
        list[i] = rand()%100;

    printf("before:\n");
    for(int i = 0; i<LIST_SIZE; i++)
        printf("%d ", list[i]);

    quickSort(list, LIST_SIZE-1);

    printf("\nafter:\n");
    for(int i = 0; i<LIST_SIZE; i++)
        printf("%d ", list[i]);  

    return 0;  
}

void quickSort(int list[], int n)
{
    if(n <= 0){
        printf("bad size!");
        exit(-1);
    }

    int stack[n];
    int top = -1;
    int l, r;

    l = 1, r = n;
    stack[++top] = l;
    stack[++top] = r;

    while(top > 0){
        r = stack[top--];
        l = stack[top--];

        int p = conqure(list, l, r);

        if(p-1 > l){
            stack[++top] = l;
            stack[++top] = p-1;
        }

        if(p+1 < r){
            stack[++top] = p+1;
            stack[++top] = r;
        }
    }
}


int conqure(int list[], int l, int r)
{
    int pivot = list[r];
    int i = l-1;

    for(int j = l; j<r; j++)
        if(list[j] < pivot){
            i++;
            swap(&list[i], &list[j]);
        }
    
    swap(&list[i+1], &list[r]);
    return i+1;
}

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()