以第一个元素为分界线(基准),将所有小于或等于它的元素移到该基准前面,将所有大于它的元素移到该基准的后面(元素交换法)

#include<stdio.h>

#include<stdlib.h>

#define MAXSIZE 20

typedef int elemtype;

typedef struct {

 elemtype data[MAXSIZE];

 int length;

}sqlist;

//交换函数

void exchange(int& x, int& y) {

 int t;

 t = x;

 x = y;

 y = t;

}

//初始化顺序表

void initlist(sqlist* L, elemtype a[], int n) {

 int i = 0;

 for (; i < n; i++)

  L->data[i] = a[i];

 L->length = n;

}

//元素交换法

//第一种元素交换方式(if和else语句实现)

void math1(sqlist* L) {

 int base = L->data[0];

 int i = 1, j = L->length - 1;

 //567263

 //base=5,i从左往右找大,j从右往左找小,当i<=j时

 //i=1,j=5, data[i]>5&&data[j]<=5成立,换,537266,i+j-

 //i=2,j=4,data[i]>成立,data[j]<=5不成立,i不变j-

 //i=2,j=3,成立,换,532766,i+j-

 //i=3,j=2,不满足i<=j退出循环

 //交换data[0]和data[j],235766

 while (i <= j) {

  if (L->data[j] <= base && L->data[i] > base)//同时成立

  {

   exchange(L->data[j], L->data[i]);

   i++;

   j--;

  }

  //至少有一个不成立

  else{

if (L->data[i] <= base)//data[i]不成立,i+

   i++;

  if (L->data[j] > base)//data[j]不成立,j-

   j--;}

 }

 exchange(L->data[j], L->data[0]);

}

 

//第一种元素交换方式(while语句实现)

void partition1(sqlist* L) {

 int i = 0, j = L->length - 1;

 elemtype base = L->data[0]; //用base存放基准

 while (i < j) { //从两边交替向中间遍历,直到i=j

  while (i<j && L->data[j]>base)

   j--; //从右往左遍历,找一个小于或等于base的元素

  while (i < j && L->data[i] <= base) //从左往右遍历,找一个大于base的元素

   i++;

  if (i < j) //由于前两个while语句结束代表找到了符合条件的j和i(或i<j不成立)

   exchange(L->data[j], L->data[i]);

 }

 exchange(L->data[i], L->data[0]);

}

 

 

//第二种元素交换方式(if和else语句实现)

void math2(sqlist* L) {

 int base = L->data[0];

 int i = 0, j = L->length - 1;

 //567263

 //base=5,i从左往右找大,j从右往左找小,当i<=j时

 //找大 567263 找小于等于

 // 此时只管j成不成立,因为data[i]>base一定不成立

 //i=0,j=5,,data[j]<=base成立,data[j]覆盖data[i],367263,i+j不变

 // (懒得打data了)此时只用管i成不成立

 //i=1,j=5,i成立,i覆盖j,367266,i不变j-

 // 此时只用管j成不成立

 //i=1,j=4,j不成立,i不变j-

 //i=1,j=3,j成立,j覆盖i,327266,i+j不变

 //此时只用管i成不成立

 //i=2,j=3,i成立,i覆盖j,327766,i不变j-

 //i=2,j=2,退出循环,data[j]=base,325766

 while (i < j) {

  int n = 0;

  if (n == 0) {

   //只管j成不成立

   if (L->data[j] <= base)//j成立,则替换,j--

   {

    L->data[i] = L->data[j];

    j--;

 

   }

   else

    j--;//j不成立,只减

   n++;

  }

  else {

   //只管i成不成立

   if (L->data[i] > base) //i成立,则替换,i++

   {

    L->data[j] = L->data[i];

    i++;

   }

   else

    i++;

   n--;

  }

 }

 L->data[j] = base;

 

}

 

//第二种元素交换方式(while语句实现)

void partition2(sqlist* L) {

 int i = 0, j = L->length - 1;

 int base = L->data[0];

 while (i < j) {

  while (i<j && L->data[j]>base)

   j--; //找满足L->data[j]<=0的j

  L->data[i] = L->data[j]; //将其放入L->data[i]处

  while (i < j && L->data[i] <= base)

   i++; //找满足L->data[i]>0的i

  L->data[j] = L->data[i]; //将其放入L->data[j]处

 }

 L->data[i] = base;

}

 

 

void displist(sqlist* L)

{

 int i = 0;

 for (; i < L->length; i++)

  printf("%d", L->data[i]);

}

 

int main()

{

 sqlist L;

 elemtype a[MAXSIZE] = { 5,6,7,2,6,3 };

 initlist(&L, a, 6);

 displist(&L);

 printf("\n");

 math1(&L);

 displist(&L);

 printf("\n");

 math2(&L);

 displist(&L);

 printf("\n");

 partition1(&L);

 displist(&L);

 printf("\n");

 partition2(&L);

 displist(&L);

 return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值