编写程序实现简单选择排序、堆排序(或归并排序),进行比较分析。
时间: 2024-02-20 11:56:12 浏览: 20
好的,我可以为您解答这个问题。下面是简单选择排序、堆排序和归并排序的实现代码以及它们的比较分析。
1. 简单选择排序
简单选择排序是一种基础的排序算法,其原理是每次从未排序的部分中选取最小的元素,然后放到已排序部分的末尾。
实现代码:
```
void selectionSort(int arr[], int n) {
int i, j, min_idx;
for (i = 0; i < n-1; i++) {
min_idx = i;
for (j = i+1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
swap(&arr[min_idx], &arr[i]);
}
}
```
时间复杂度:O(n^2)
空间复杂度:O(1)
2. 堆排序
堆排序是一种利用堆这种数据结构进行排序的算法。可以分为两步,第一步是将数组构建成一个大根堆(或小根堆),第二步是依次取出堆顶元素(最大值或最小值),并重新调整堆。
实现代码:
```
void heapify(int arr[], int n, int i) {
int largest = i;
int l = 2*i + 1;
int r = 2*i + 2;
if (l < n && arr[l] > arr[largest])
largest = l;
if (r < n && arr[r] > arr[largest])
largest = r;
if (largest != i) {
swap(&arr[i], &arr[largest]);
heapify(arr, n, largest);
}
}
void heapSort(int arr[], int n) {
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
for (int i=n-1; i>=0; i--) {
swap(&arr[0], &arr[i]);
heapify(arr, i, 0);
}
}
```
时间复杂度:O(nlogn)
空间复杂度:O(1)
3. 归并排序
归并排序采用分治的思想,将待排序数组不断分成两个子数组,直到每个子数组只有一个元素,然后将两个有序的子数组合并成一个有序的数组,直到整个数组有序。
实现代码:
```
void merge(int arr[], int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void mergeSort(int arr[], int l, int r) {
if (l < r) {
int m = l+(r-l)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
```
时间复杂度:O(nlogn)
空间复杂度:O(n)
比较分析:
从时间复杂度和空间复杂度上来看,归并排序是三种算法中最优秀的,但是在实际应用中,堆排序也比较常用,因为它的空间复杂度比归并排序低,而且常数项也比较小。简单选择排序的时间复杂度和空间复杂度都比较高,不适合处理大规模数据。