当前位置:
首页 >
元素分界线
发布时间:2024/1/18
71
豆豆
题目描述:以第一个元素为基准,将所有小于等于它的元素移动到该元素的前面,将所有大于它的元素移动到该元素的后面。
#include<stdio.h> #include"sqlist.cpp" /* 设计一个算法,以第一个元素为分界线, 将所有小于它的元素移到该元素的前面, 将所有大于它的元素移到该元素的后面。 */ void Move1(SqList *&L) {int i=0,j=L->length -1;//定义i和j两个指针,i指针指向第一个元素,j指针指向最后一个元素 ElemType temp;ElemType pivot=L->data [0];//以data[0]为基准 while(i<j)//从区间两端交替向中间扫描,直至i=j为止{while(j>i && L->data [j]>pivot)j--;//从右向左扫描,找一个小于等于pivot的元素while(i<j && L->data [i]<=pivot)i++;//从左向右扫描,找一个大于pivot的元素if(i<j)//L->data [i] <--> L->data [j]{temp = L->data [i];L->data [i] = L->data [j];L->data [j] = temp;}//以下输出每一趟的结果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("基准位置i=%d\n",i); }int main(int argc,char *argv[]) {SqList *L;ElemType a[10];printf("请输入10个正整数:");for(int m=0;m<10;m++)scanf("%d",&a[m]);CreateList(L,a,10);printf("L:");DisplayList(L);printf("执行移动运算\n");Move1(L);printf("L:");DisplayList(L);DestroyList(L);return 0; }解法2:
#include<stdio.h> #include"sqlist.cpp" /* 设计一个算法,以第一个元素为分界线, 将所有小于它的元素移到该元素的前面, 将所有大于它的元素移到该元素的后面。 */ void Move2(SqList *&L) {int i=0,j=L->length -1;//定义i和j两个指针,i指针指向第一个元素,j指针指向最后一个元素 ElemType pivot=L->data [0];//以data[0]为基准 while(i<j)//从区间两端交替向中间扫描,直至i=j为止{while(j>i && L->data [j]>pivot)j--;//从右向左扫描,找一个小于等于pivot的元素L->data [i] = L->data [j];i++;while(i<j && L->data [i]<=pivot)i++;//从左向右扫描,找一个大于pivot的元素L->data [j] = L->data [i];j--;//以下输出每一趟的结果for(int k=0;k<L->length ;k++){printf("%2d",L->data [k]);} printf("\n");}L->data [i] = pivot;printf("基准位置i=%d\n",i); }int main(int argc,char *argv[]) {SqList *L;ElemType a[10];printf("请输入10个正整数:");for(int m=0;m<10;m++)scanf("%d",&a[m]);CreateList(L,a,10);printf("L:");DisplayList(L);printf("执行移动运算\n");Move2(L);printf("L:");DisplayList(L);DestroyList(L);return 0; }