C语言归并排序,堆排序,桶排序的实现完整代码
时间: 2023-09-12 19:04:46 浏览: 115
### 回答1:
以下是C语言实现归并排序、堆排序和桶排序的完整代码示例:
归并排序:
```c
#include <stdio.h>
// 合并两个有序数组
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);
}
}
// 测试
int main() {
int arr[] = { 12, 11, 13, 5, 6, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
printf("原数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 归并排序
mergeSort(arr, 0, n - 1);
printf("排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
堆排序:
```c
#include <stdio.h>
// 调整堆
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) {
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
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--) {
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapify(arr, i, 0);
}
}
// 测试
int main() {
int arr[] = { 12, 11, 13, 5, 6, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
printf("原数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 堆排序
heapSort(arr, n);
printf("排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
桶排序:
```c
#include <stdio.h>
// 桶排序
void bucketSort(int arr[], int n) {
// 找到数组中的最大值
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// 创建桶,并初始化为0
int bucket[max + 1];
for (int i = 0; i < max + 1; i++) {
bucket[i] = 0;
}
// 将元素放入桶中
for (int i = 0; i < n; i++) {
bucket[arr[i]]++;
}
// 将桶中元素依次放回原数组中
int index = 0;
for (int i = 0; i < max + 1; i++) {
while (bucket[i] > 0) {
arr[index++] = i;
bucket[i]--;
}
}
}
// 测试
int main() {
int arr[] = { 4, 1, 3, 2, 5, 8, 7, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
printf("原数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 桶排序
bucketSort(arr, n);
printf("排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
### 回答2:
C语言归并排序的实现代码如下:
```
#include <stdio.h>
void merge(int arr[], int left, int mid, int right) {
int i, j, k;
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[left + i];
for (j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
i = 0;
j = 0;
k = left;
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 left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main() {
int arr[] = {8, 4, 1, 7, 3, 5, 2, 6};
int n = sizeof(arr) / sizeof(arr[0]);
mergeSort(arr, 0, n - 1);
printf("排序后的数组为: \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
```
C语言堆排序的实现代码如下:
```
#include <stdio.h>
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void heapify(int arr[], int n, int i) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest])
largest = left;
if (right < n && arr[right] > arr[largest])
largest = right;
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);
}
}
int main() {
int arr[] = {8, 4, 1, 7, 3, 5, 2, 6};
int n = sizeof(arr) / sizeof(arr[0]);
heapSort(arr, n);
printf("排序后的数组为: \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
```
C语言桶排序的实现代码如下:
```
#include <stdio.h>
void bucketSort(int arr[], int n) {
int max_val = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max_val)
max_val = arr[i];
}
max_val++;
int buckets[max_val];
for (int i = 0; i < max_val; i++)
buckets[i] = 0;
for (int i = 0; i < n; i++)
buckets[arr[i]]++;
for (int i = 0, j = 0; j < max_val; j++) {
while (buckets[j] > 0) {
arr[i++] = j;
buckets[j]--;
}
}
}
int main() {
int arr[] = {8, 4, 1, 7, 3, 5, 2, 6};
int n = sizeof(arr) / sizeof(arr[0]);
bucketSort(arr, n);
printf("排序后的数组为: \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
```
阅读全文