数据结构实现快速排序
时间: 2023-12-30 18:24:10 浏览: 37
以下是使用数组实现快速排序的示例代码:
```python
def quickSort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
less = [x for x in arr[1:] if x <= pivot]
greater = [x for x in arr[1:] if x > pivot]
return quickSort(less) + [pivot] + quickSort(greater)
arr = [4, 2, 7, 1, 9, 5]
sorted_arr = quickSort(arr)
print(sorted_arr) # 输出:[1, 2, 4, 5, 7, 9]
```
快速排序的基本思想是选择一个元素作为基准值,将数组分成两个子数组,一个子数组中的元素都小于基准值,另一个子数组中的元素都大于基准值。然后对这两个子数组分别进行快速排序,最后将两个子数组和基准值合并起来。
快速排序的时间复杂度为O(nlogn),其中n是数组的长度。快速排序是一种原地排序算法,不需要额外的空间。
相关问题
数据结构快速排序实现
以下是C语言实现快速排序的代码和步骤:
```c
#include <stdio.h>
void quick_sort(int arr[], int low, int high) {
if (low < high) {
int i = low, j = high, pivot = arr[low];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = pivot;
quick_sort(arr, low, i - 1);
quick_sort(arr, i + 1, high);
}
}
int main() {
int arr[] = {5, 3, 8, 4, 2, 7, 1, 10};
int len = sizeof(arr) / sizeof(arr[0]);
quick_sort(arr, 0, len - 1);
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
步骤:
1. 选取一个基准元素pivot,一般选择第一个元素。
2. 从数组的两端开始向中间扫描,设两个指针i和j,i从左边开始扫描,j从右边开始扫描。
3. 如果i所指向的元素大于等于pivot,就一直向右移动i,直到找到一个小于pivot的元素为止。
4. 如果j所指向的元素小于pivot,就一直向左移动j,直到找到一个大于等于pivot的元素为止。
5. 交换i和j所指向的元素。
6. 重复3、4、5步,直到i和j相遇。
7. 将基准元素与i所指向的元素交换。
8. 对基准元素左边的子数组进行快速排序。
9. 对基准元素右边的子数组进行快速排序。
c++数据结构快速排序
c数据结构的快速排序是一种常用的排序算法,它的时间复杂度为O(nlogn)。快速排序的基本思想是通过选取一个基准元素,将待排序数组分割成两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素,然后对这两个子数组分别进行快速排序。通过递归地重复这个过程,最终得到一个有序的数组。
快速排序的具体步骤如下:
1. 选择一个基准元素,常用的选择方法是选取数组的第一个元素。
2. 将数组分割成两个子数组,使得一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素。
3. 对这两个子数组分别进行快速排序,即递归地调用快速排序算法。
4. 将两个有序的子数组合并起来,得到最终的有序数组。
在实现快速排序算法时,需要注意以下几点:
1. 需要定义一个划分函数,用于将数组分割成两个子数组。
2. 在划分函数中,可以使用双指针法或者单指针法来实现。
3. 划分函数可以选择将基准元素放在最终排序位置的左边或右边。
4. 为了提高快速排序算法的效率,可以采用随机选择基准元素的方法,避免基准元素的选择对算法性能产生不利影响。
参考代码如下(使用双指针法实现):
```
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high); // 划分数组,获取基准元素的位置
quickSort(arr, low, pivotIndex - 1); // 对左侧子数组进行快速排序
quickSort(arr, pivotIndex + 1, high); // 对右侧子数组进行快速排序
}
}
int partition(int arr[], int low, int high) {
int pivot = arr[low]; // 选择第一个元素作为基准元素
int i = low, j = high;
while (i < j) {
// 从右向左找到第一个小于基准元素的位置
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
// 从左向右找到第一个大于基准元素的位置
while (i < j && arr[i] <= pivot) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
// 将基准元素放到最终排序位置
arr[i] = pivot;
return i;
}
```