写一个c++快速排序算法
时间: 2023-09-22 18:06:22 浏览: 113
### 回答1:
我可以给你一个快速排序算法的例子,如下: 1. 从数列中挑选一个基准元素。
2. 将所有比基准元素小的放到它的左边,所有比基准元素大的放到它的右边。
3. 对划分后的子序列重复第一、二步,直到所有子序列只剩下一个元素为止。
### 回答2:
快速排序是一种常用的排序算法,它的思想是通过分治的策略,将一个待排序数组不断地划分为较小和较大的两个子数组,再对这两个子数组递归地进行排序,最终得到有序的数组。
在C语言中,实现快速排序算法可以使用递归或循环方式。下面是一个使用递归方式实现的快速排序算法示例:
```c
#include <stdio.h>
// 交换数组中两个元素的位置
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
// 划分函数,返回划分后基准元素的下标位置
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 选择最后一个元素作为基准元素
int i = (low - 1); // 定义较小元素的索引
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
// 快速排序函数,利用递归实现
void quickSort(int arr[], int low, int high) {
if (low < high) {
// 对数组进行划分
int pivot = partition(arr, low, high);
// 对划分后的子数组进行排序
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
// 将数组打印出来
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {23, 20, 12, 45, 9, 18, 56};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组: ");
printArray(arr, n);
quickSort(arr, 0, n - 1); // 调用快速排序函数
printf("排序后的数组: ");
printArray(arr, n);
return 0;
}
```
运行上述代码,输出结果为:
```
原始数组: 23 20 12 45 9 18 56
排序后的数组: 9 12 18 20 23 45 56
```
这个示例代码演示了快速排序算法的实现过程。通过定义划分函数和快速排序函数,配合使用递归方法,可以得到按照升序排列的有序数组。
### 回答3:
快速排序是一种常用的排序算法,它基于分治的思想。算法的核心思想是选择一个基准元素,通过一轮比较和交换将数组划分为两个部分,左侧是小于基准元素的部分,右侧是大于基准元素的部分。然后递归地对两个部分进行快速排序,直到待排序数组的长度为1或0。
具体实现如下:
1. 定义一个函数进行快速排序,函数的输入参数包括待排序数组、起始位置和终止位置。
2. 在函数内部,选择一个基准元素,可以是数组的第一个元素。
3. 初始化左指针为起始位置,右指针为终止位置。
4. 循环进行以下操作:
- 从右指针开始向左移动,直到找到一个小于基准元素的元素,将其与基准元素交换。
- 从左指针开始向右移动,直到找到一个大于基准元素的元素,将其与基准元素交换。
- 重复上述两个步骤,直到左指针大于等于右指针。
5. 将基准元素与左指针指向的元素交换。
6. 递归地对左半部分和右半部分进行快速排序,直到左指针大于等于右指针。
这样就完成了整个快速排序算法的实现。
快速排序算法的时间复杂度为O(nlogn),其中n为待排序数组的长度。它是一种稳定的排序算法,因为相同元素的相对顺序不会改变。快速排序算法在实际应用中具有较好的性能表现,因此被广泛使用。
阅读全文