1. 程式人生 > >對一個順序表以首元素為pivot進行partion操作

對一個順序表以首元素為pivot進行partion操作

#include <stdio.h>

/*
題目:天勤40頁(5)
將順序表L中所有小於表頭元素的元素放在表的前半部分,大於表頭元素的元素放在後半部分
順序表中沒有相同元素
(這是快速排序的partition部分)

演算法:
基於兩個下標變數,一個對順序表進行從前往後的遍歷,一個對順序表進行從後往前的遍歷,
並在適當是時機進行值交換
*/

#define maxlen 50
#define DATATYPE int

typedef struct{
    DATATYPE arr[maxlen];
    int length;
}Seqlist;

void print_SQ(Seqlist list)
{
    for(int i=0;i<list.length;i++){
        printf("%d ",list.arr[i]);
    }
    printf("\n");
}


int main(void)
{
    Seqlist list = {{6,3,6,6,1,1,10},7};

    int i=0,j=list.length-1;
    //pivot存放樞紐值
    int pivot = list.arr[0];


    while(i < j){
        //j從後往前遍歷順序表,i從前往後遍歷順序表(i與j交替遍歷)
        //因為樞紐是表的第一個元素,所以先用j從後往前遍歷順序表
        while(i<j && list.arr[j]>pivot){
            --j;
        }
        //i<j是基於值交換的重要前提,時刻保證此條件的滿足性
        if(i<j){
            //list.arr[j]<pivot,把它賦值給list.arr[i]
            list.arr[i] = list.arr[j];
            ++i;
        }

        //再用i從前往後遍歷順序表
        while(i<j && list.arr[i]<pivot){
            ++i;
        }

        if(i<j){
           //list.arr[i]>pivot,把它賦值給list.arr[j]
            list.arr[j] = list.arr[i];
            --j;
        }

    }
    //此時i==j,把樞紐賦進list.arr[i],也即list.arr[j]
    list.arr[i] = pivot;

    print_SQ(list);
}