实验名称
实验四 排序中分治法的程序设计
实验目的
(1)掌握归并排序和快速排序的划分方法;
(2)掌握归并排序和快速排序的具体分治策略;
(3)在掌握的基础上编程两种排序方法的实现过程。
实验题目
给出一个初始序列,分别用归并排序和快速排序两种分治法将所给序列变换为有序序列,输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。
实验源代码
归并排序:
#include<stdio.h>
void Merge(int arr[], int r[], int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
Merge(arr, r, start1, end1);
Merge(arr, r, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
r[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
while (start1 <= end1)
r[k++] = arr[start1++];
while (start2 <= end2)
r[k++] = arr[start2++];
for (k = start; k <= end; k++)
arr[k] = r[k];
}
void MergeSort(int arr[], const int len) {
int r[len];
Merge(arr, r, 0, len - 1);
}
int main(){
int arr[100], len;
printf("请输入数组的长度:");
scanf("%d", &len);
printf("请输入数组的元素(各元素按空格隔开):");
for(int i=0; i<len; i++){
scanf("%d", &arr[i]);
}
MergeSort(arr,len);
printf("归并排序之后的数组为:");
for(int i=0; i<len; i++){
printf("%d ", arr[i]);
}
}
快速排序:
#include<stdio.h>
typedef struct _Range {
int start, end;
} Range;
Range new_Range(int s, int e) {
Range r;
r.start = s;
r.end = e;
return r;
}
void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
void QuickSort(int arr[], const int len) {
if (len <= 0)
return;
Range r[len];
int p = 0;
r[p++] = new_Range(0, len - 1);
while (p) {
Range range = r[--p];
if (range.start >= range.end)
continue;
int mid = arr[range.end];
int left = range.start, right = range.end - 1;
while (left < right) {
while (arr[left] < mid && left < right)
left++;
while (arr[right] >= mid && left < right)
right--;
swap(&arr[left], &arr[right]);
}
if (arr[left] >= arr[range.end])
swap(&arr[left], &arr[range.end]);
else
left++;
r[p++] = new_Range(range.start, left - 1);
r[p++] = new_Range(left + 1, range.end);
}
}
int main(){
int arr[100], len;
printf("请输入数组的长度:");
scanf("%d", &len);
printf("请输入数组的元素(各元素按空格隔开):");
for(int i=0; i<len; i++){
scanf("%d", &arr[i]);
}
QuickSort(arr,len);
printf("归并排序之后的数组为:");
for(int i=0; i<len; i++){
printf("%d ", arr[i]);
}
}
实验结果(给出题目的运行结果(插入运行结果截图))
归并排序:
快速排序:
归并排序的复杂度:T(n) = O(nlogn);
快速排序的复杂度:T(n) = O(nlogn);