#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;
}