用C++实现数组{6,2,3,1,7,4,8,9}的快速排序,归并排序和堆排序
时间: 2023-10-09 20:09:47 浏览: 38
好的,我可以回答你的问题。
首先,让我们看一下快速排序的实现。具体步骤如下:
1. 选择一个基准元素(通常是数组的第一个元素)。
2. 将数组分为两部分,使得左边部分的所有元素小于等于基准元素,右边部分的所有元素大于等于基准元素。
3. 对左边和右边的子数组分别进行快速排序,直到每个子数组都只剩下一个元素为止。
下面是用 C 语言实现快速排序的代码:
void quick_sort(int arr[], int left, int right) {
if (left >= right) {
return;
}
int i = left;
int j = right;
int pivot = arr[left];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
arr[i] = arr[j];
while (i < j && arr[i] <= pivot) {
i++;
}
arr[j] = arr[i];
}
arr[i] = pivot;
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
接下来是归并排序的实现。具体步骤如下:
1. 将数组分为两个子数组,分别进行归并排序。
2. 将排好序的子数组合并成一个有序数组。
下面是用 C 语言实现归并排序的代码:
void merge(int arr[], int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (int i = 0; i < n1; i++) {
L[i] = arr[left + i];
}
for (int j = 0; j < n2; j++) {
R[j] = arr[mid + 1 + j];
}
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k++] = L[i++];
} else {
arr[k++] = R[j++];
}
}
while (i < n1) {
arr[k++] = L[i++];
}
while (j < n2) {
arr[k++] = R[j++];
}
}
void merge_sort(int arr[], int left, int right) {
if (left >= right) {
return;
}
int mid = (left + right) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
最后是堆排序的实现。具体步骤如下:
1. 构建一个最大堆,使得堆顶元素是数组中的最大元素。
2. 将堆顶元素与数组的最后一个元素交换位置,并将数组长度减一。
3. 对交换后的堆顶元素进行堆化操作,使其满足堆的性质。
4. 重复步骤2和3,直到数组长度为1。
下面是用 C 语言实现堆排序的代码:
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) {
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
heapify(arr, n, largest);
}
}
void heap_sort(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);
}
}
希望对你有帮助!