题目:创建一个顺序表,存放在数组 A[N]中,元素的类型为整型,设计算法调整 A,使其左边的所有元素小于 0,右边的所有元素大于 0(要求算法的时间复杂度和空 间复杂度均为 O(n))

  • Post author:
  • Post category:其他


算法思想:首先将数据分成两类(负数和非负数),然后利用下列代码将负数和非负数分开。

1 // 从左侧开始找到一个大于或者等于0的数

2 // 从右侧开始找到一个小于0的数

3 // 然后进行交换

4 while(i<j)

5 {


6 while(A[i]<0&&i<j)i++; // 从左边找到一个大于等于0的数

7 while(A[j]>=0&&i<j)j–; // 从右边找到一个小于等于0的数

8 if(i<j)

9 {


10 Temp = A[i];

11 A[i] = A[j];

12 A[j] = Temp;

13 }

14 i++;

15 j–;

16 }

之后再利用这个思想将0和正数分开,具体做法请见完整代码

SeqList.h

1 #ifndef SeqList_H

2 #define SeqList_H

3 const int MAXSIZE = 20; // 用于定义数组最大容量

4

5 // 线性表数据结构

6 template class SeqList // 定于模板类

7 {


8 public:

9 SeqList(){


10 length = 0;

11 }

12 SeqList(DataType a[], int n); // 构造函数,建立长度为n的顺序表

13 ~SeqList(){ // 析构函数

14 length=0;

15 }

16 void arithmetic(); // 使其数组A左边的所有元素小于 0,右边的所有元素大于 0

17 void funcexchange(int p, int q); // 交换两个值

18 void printList(); // 遍历操作

19 private:

20 DataType A[MAXSIZE]; // 存放数据元素的数组

21 int length; // 当前线性表的长度

22 };

23 #endif

SeqList.cpp

1 # include // 引用输入输出流库函数的头文件

2 using namespace std;

3 # include “SeqList.h” // 引用顺序表类的声明和定义

4

5 // 构造函数,建立长度为n的顺序表

6 template SeqList::SeqList(DataType a[], int n)

7 {


8 if (n > MAXSIZE) throw “参数非法”;

9 for (int i=0; i < n; i++)

10 {


11 A[i] = a[i];

12 }

13 length = n;

14 }

15

16 // 使其数组A左边的所有元素小于 0,右边的所有元素大于 0

17 template void SeqList::arithmetic()

18 {


19 int i = 0, j = length-1, Temp;

20 while(i<j)

21 {


22 while(A[i]<0&&i<j)i++; // 从左边找到一个大于等于0的数

23 while(A[j]>=0&&i<j)j–; // 从右边找到一个小于等于0的数

24 if(i<j)

25 {


26 Temp = A[i];

27 A[i] = A[j];

28 A[j] = Temp;

29 }

30 i++;

31 j–;

32 }

33 j=length-1;

34 // 这个时候i=j左边都是负数

35 while(i<j)

36 {


37 while(A[i]==0&&i<j)i++; // 从左边找到一个大于等于0的数

38 while(A[j]>0&&i<j)j–; // 从右边找到一个小于等于0的数

39 if(i<j)

40 {


41 Temp = A[i];

42 A[i] = A[j];

43 A[j] = Temp;

44 }

45 i++;

46 j–;

47 }

48 }

49

50

51 // 函数功能:利用下标交换两个值内容

52 template void SeqList::funcexchange(int p, int q)

53 {


54 int temp;

55 temp = A[p];

56 A[p] = A[q];

57 A[q] = temp;

58 }

59

60 // 遍历顺序表

61 template void SeqList::printList()

62 {


63 for (int i=0; i < length; i++)

64 cout<<A[i]<<“\t”;

65 cout<<endl;

66 }

SeqList_main.cpp

1 # include

2 # include “SeqList.cpp” // 引用顺序表类的声明和定义

3

4 int main(void)

5 {


6 int A[7] = {1, -1, 2, -2, 0, 0, 0};

7 int B[7] = {-1, -2, 0, 2, 2, -1, 0};

8 int C[7] = {0, 1, 2, 3, 0, 2, -1};

9 int D[8] = {1, 0, 0, 3, 0, 2, 0, 4};

10 int E[15] = {-9,85,0,25,0,140,-48,3,-64,-15,0,0,78,-46,-12};

11

12 SeqList L1(A, 7); // 建立有七个元素的顺序表

13 cout<<“L1线性表的数据为:”;

14 L1.printList();

15 L1.arithmetic();

16 cout<<“L1排序后的数据为:”;

17 L1.printList();

18 cout<<endl;

19

20 SeqList L2(B, 7); // 建立有七个元素的顺序表

21 cout<<“L2线性表的数据为:”;

22 L2.printList();

23 L2.arithmetic();

24 cout<<“L2排序后的数据为:”;

25 L2.printList();

26 cout<<endl;

27

28

29 SeqList L3(C, 7); // 建立有七个元素的顺序表

30 cout<<“L3线性表的数据为:”;

31 L3.printList();

32 L3.arithmetic();

33 cout<<“L3排序后的数据为:”;

34 L3.printList();

35 cout<<endl;

36

37

38

39 SeqList L4(D, 8); // 建立有七个元素的顺序表

40 cout<<“L4线性表的数据为:”;

41 L4.printList();

42 L4.arithmetic();

43 cout<<“L4排序后的数据为:”;

44 L4.printList();

45 cout<<endl;

46

47 SeqList L5(E, 15); // 建立有七个元素的顺序表

48 cout<<“L5线性表的数据为:”;

49 L5.printList();

50 L5.arithmetic();

51 cout<<“L5排序后的数据为:”;

52 L5.printList();

53 cout<<endl;

54

55

56 system(“pause”);

57 return 0;

58 }

本人技术有限,第一次写博客,欢迎各位大佬指教,有更好的方法也可以告诉我。



版权声明:本文为CLAY_is_Insane原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。