對一個順序表以首元素為pivot進行partion操作
阿新 • • 發佈:2018-11-05
#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); }