題目1:創建一個順序表,存放在數組 A[N]中,元素的類型為整型,設計算法調整 A,使其左邊的所有元素小於 0,右邊的所有元素大於 0(要求算法的時間復雜度和空 間復雜度均為 O(n))。
move.c
#include "move.h"
int main()
{
int a[10]={-1,2,4,-5,6,8,-9,2 ,-2,-6},i;
SequenList *A; //定義一個指針
A=Init_SequenList( );
for(i=0;i<10;i++)
Insert_SequenList(A,a[i],i+1);
Print_SequenList(A);
printf("\n調整后:\n");
quickSwapList(A);
Print_SequenList(A);
return 0;
}
move.h
#ifndef SEQL
#define SEQL
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype; /*假定線性表元素的類型為整型*/
#define MAXSIZE 20 /*假定線性表的最大長度為1024*/
typedef struct
{ elemtype data[MAXSIZE];
/*定義線性表數組,第一個結點是data[0] */
int last; /*記錄線性表中最后一個元素在數組中的位置*/
} SequenList,*SQL;
//順序表的初始化
SequenList * Init_SequenList( )
{ SequenList *L;
L = (SequenList *) malloc ( sizeof( SequenList ) );
L->last = -1;
return L;
}
int Insert_SequenList(SequenList *L, elemtype x, int i )
/*在順序表中指定的位置插入值為x的結點,L是SequenList類型的指針變量*/
/* x是待插入結點的數據元素值,i 是在順序表中的插入位置*/
{ int j;
if ( L->last >= MAXSIZE - 1 ) /*表滿?*/
{ return 0; }
if( i < 1 || i > L->last + 2 ) /*插入位置非法?*/
{ return -1; }
for( j = L->last; j >= i - 1; j --) /*1. 移動*/
L->data[j + 1] = L->data[j];
L->data[ i - 1] = x; /*2. 插入*/
L->last = L->last + 1; /*3. 表長+1*/
return 1; /*插入成功,函數返回1*/
}
int Delete_SequenList(SequenList *L, int i)
{ int j;
if ( i < 1 || i > L->last + 1 )
{
return 0;
}
else
{ for( j = i; j <= L->last; j ++)
L->data[j - 1] = L->data[j];
L->last --; }
return 1;
}
void Print_SequenList(SequenList *L) /*順序表遍歷算法*/
{ int i;
for ( i = 0; i <= L->last; i ++ )
{ printf("a[%2d] = %4d\t", i + 1,L->data[i] );
if ((i + 1)%5 == 0)
printf("\n");
}
}
/*左負右正*/
void quickSwapList(SequenList *A)
{
int i=0,j=A->last;
int temp;
while(i<j)
{
while(i<j&&A->data[i]<0)
i++;
while(i<j&&A->data[j]>=0)
j--;
if(i<j)
{
temp=A->data[i];
A->data[i]=A->data[j];
A->data[j]=temp;
}
i++;
j--;
}
}
#endif