总结:不是所有的循环都适合用for,一定要改掉自己只用for 循环的习惯。
/*
设顺序表L有10个整数。
设计一个算法,以第一个元素为分界线(基准),
将所有小于等于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面
*/
#include<stdio.h>
#include <time.h>
#include<stdlib.h>
typedef struct
{
int data[100];
int length;
}Sqlist;
void Createlist(Sqlist *&L,int a[],int n);
void sort(Sqlist *&L);
int main()
{
int i;
int a[] = {5,9,8,7,6,4,3,2,1,0};
Sqlist *L;
Createlist(L,a,10);
sort(L);
for( i = 0; i < 10;i++)
{
printf("%d\n",L->data[i]);
}
return 0;
}
void Createlist(Sqlist *&L,int a[],int n)
{
int i;
L = (Sqlist *)malloc(sizeof(Sqlist));
for( i = 0; i < n; i++)
{
L->data[i] = a[i];
}
L->length = n;
}
void sort(Sqlist *&L)
{
int a,i,j;
int temp;
i = 1;
j = L->length-1;
a = L->data[0];
while(i < j)
{
while( i < j && L->data[j] > a)
j--;
while( i < j && L->data[i] <= a)
i++;
if( i < j)
{
temp = L->data[i];
L->data[i] = L->data[j];
L->data[j] = temp;
}
}
temp = L->data[0];
L->data[0] = L->data[j];
L->data[j] = temp;
}
/*
a=L->data[0](基准)
j从后向前找小于等于pivot的元素:前移
i从前向后找大于pivot的元素:后移
*/
#include<stdio.h>
#include <time.h>
#include<stdlib.h>
typedef struct
{
int data[100];
int length;
}Sqlist;
void Createlist(Sqlist *&L,int a[],int n);
void sort(Sqlist *&L);
int main()
{
int i;
int a[] = {5,9,8,7,6,4,3,2,1,0};
Sqlist *L;
Createlist(L,a,10);
sort(L);
for( i = 0; i < 10;i++)
{
printf("%d\n",L->data[i]);
}
return 0;
}
void Createlist(Sqlist *&L,int a[],int n)
{
int i;
L = (Sqlist *)malloc(sizeof(Sqlist));
for( i = 0; i < n; i++)
{
L->data[i] = a[i];
}
L->length = n;
}
void sort(Sqlist *&L)
{
int i ,j;
int a = L->data[0];
i = 0;
j = L->length - 1;
while( i < j)
{
while( i < j && L->data[j] <= a)
{
j--;
L->data[i] = L->data[j];
}
while( i < j && L->data[i] > a)
{
i++;
L->data[j] = L->data[i];
}
if( i ==j )
{
L->data[i] = a;
}
}
}