元素分界线
題目描述:以第一個(gè)元素為基準(zhǔn),將所有小于等于它的元素移動(dòng)到該元素的前面,將所有大于它的元素移動(dòng)到該元素的后面。
#include<stdio.h> #include"sqlist.cpp" /* 設(shè)計(jì)一個(gè)算法,以第一個(gè)元素為分界線, 將所有小于它的元素移到該元素的前面, 將所有大于它的元素移到該元素的后面。 */ void Move1(SqList *&L) {int i=0,j=L->length -1;//定義i和j兩個(gè)指針,i指針指向第一個(gè)元素,j指針指向最后一個(gè)元素 ElemType temp;ElemType pivot=L->data [0];//以data[0]為基準(zhǔn) while(i<j)//從區(qū)間兩端交替向中間掃描,直至i=j為止{while(j>i && L->data [j]>pivot)j--;//從右向左掃描,找一個(gè)小于等于pivot的元素while(i<j && L->data [i]<=pivot)i++;//從左向右掃描,找一個(gè)大于pivot的元素if(i<j)//L->data [i] <--> L->data [j]{temp = L->data [i];L->data [i] = L->data [j];L->data [j] = temp;}//以下輸出每一趟的結(jié)果for(int k=0;k<L->length ;k++){printf("%2d",L->data [k]);} printf("\n");}//L->data [0] <--> L->data [j]temp = L->data [0];L->data [0] = L->data [j];L->data [j] = temp;printf("基準(zhǔn)位置i=%d\n",i); }int main(int argc,char *argv[]) {SqList *L;ElemType a[10];printf("請(qǐng)輸入10個(gè)正整數(shù):");for(int m=0;m<10;m++)scanf("%d",&a[m]);CreateList(L,a,10);printf("L:");DisplayList(L);printf("執(zhí)行移動(dòng)運(yùn)算\n");Move1(L);printf("L:");DisplayList(L);DestroyList(L);return 0; }解法2:
#include<stdio.h> #include"sqlist.cpp" /* 設(shè)計(jì)一個(gè)算法,以第一個(gè)元素為分界線, 將所有小于它的元素移到該元素的前面, 將所有大于它的元素移到該元素的后面。 */ void Move2(SqList *&L) {int i=0,j=L->length -1;//定義i和j兩個(gè)指針,i指針指向第一個(gè)元素,j指針指向最后一個(gè)元素 ElemType pivot=L->data [0];//以data[0]為基準(zhǔn) while(i<j)//從區(qū)間兩端交替向中間掃描,直至i=j為止{while(j>i && L->data [j]>pivot)j--;//從右向左掃描,找一個(gè)小于等于pivot的元素L->data [i] = L->data [j];i++;while(i<j && L->data [i]<=pivot)i++;//從左向右掃描,找一個(gè)大于pivot的元素L->data [j] = L->data [i];j--;//以下輸出每一趟的結(jié)果for(int k=0;k<L->length ;k++){printf("%2d",L->data [k]);} printf("\n");}L->data [i] = pivot;printf("基準(zhǔn)位置i=%d\n",i); }int main(int argc,char *argv[]) {SqList *L;ElemType a[10];printf("請(qǐng)輸入10個(gè)正整數(shù):");for(int m=0;m<10;m++)scanf("%d",&a[m]);CreateList(L,a,10);printf("L:");DisplayList(L);printf("執(zhí)行移動(dòng)運(yùn)算\n");Move2(L);printf("L:");DisplayList(L);DestroyList(L);return 0; }?
?
總結(jié)