采用顺序存储结构,完成顺序表的创建,实现对顺序表的选择排序,归并排序
时间: 2023-09-09 21:11:01 浏览: 133
好的,我来分别回答你的问题。
1. 顺序表创建:
顺序表是一种线性表的存储结构,可以采用数组的形式进行存储。下面是一个简单的顺序表创建的代码示例:
```c
#define MAXSIZE 100 // 定义顺序表的最大长度
typedef struct {
int data[MAXSIZE];
int length;
} SqList;
void InitList_Sq(SqList *L) {
L->length = 0;
}
```
在上面的代码中,我们定义了一个 SqList 结构体,其中 data 数组用于存储顺序表中的元素,length 表示顺序表的长度。InitList_Sq 函数用于初始化顺序表。
2. 顺序表选择排序:
选择排序是一种简单直观的排序算法,基本思想是将待排序序列分为有序区和无序区,每次从无序区中选择最小(大)的元素放到有序区的末尾。下面是一个简单的顺序表选择排序的代码示例:
```c
void SelectSort_Sq(SqList *L) {
int i, j, min;
for (i = 0; i < L->length - 1; i++) {
min = i;
for (j = i + 1; j < L->length; j++) {
if (L->data[j] < L->data[min]) {
min = j;
}
}
if (min != i) {
int temp = L->data[i];
L->data[i] = L->data[min];
L->data[min] = temp;
}
}
}
```
在上面的代码中,我们使用两层循环,外层循环遍历整个顺序表,内层循环找到当前无序区中最小的元素,将其与有序区的末尾元素交换。最终,整个顺序表就会被排序。
3. 顺序表归并排序:
归并排序是一种高效的排序算法,基本思想是将待排序序列分成若干个子序列,对每个子序列进行排序,然后再将排好序的子序列合并成一个有序序列。下面是一个简单的顺序表归并排序的代码示例:
```c
void Merge_Sq(int A[], int low, int mid, int high, int temp[]) {
int i = low, j = mid + 1, k = 0;
while (i <= mid && j <= high) {
if (A[i] <= A[j]) {
temp[k++] = A[i++];
} else {
temp[k++] = A[j++];
}
}
while (i <= mid) {
temp[k++] = A[i++];
}
while (j <= high) {
temp[k++] = A[j++];
}
for (i = 0; i < k; i++) {
A[low + i] = temp[i];
}
}
void MergeSort_Sq(int A[], int low, int high, int temp[]) {
if (low < high) {
int mid = (low + high) / 2;
MergeSort_Sq(A, low, mid, temp);
MergeSort_Sq(A, mid + 1, high, temp);
Merge_Sq(A, low, mid, high, temp);
}
}
void MergeSort_SqMain(int A[], int n) {
int *temp = (int *)malloc(n * sizeof(int));
MergeSort_Sq(A, 0, n - 1, temp);
free(temp);
}
```
在上面的代码中,我们使用了归并排序的经典递归实现方式。首先,将待排序序列分成两个子序列,对每个子序列进行排序,然后将排好序的子序列合并成一个有序序列。最终,整个顺序表就会被排序。需要注意的是,由于归并排序需要用到额外的空间,因此我们需要在函数内部分配一个临时数组 temp,用于存储归并时的中间结果。函数执行完毕后,要记得释放这个临时数组的内存。
阅读全文