用c写一个分治法的快速排序,以最后一个元素为基准元素
时间: 2024-05-05 18:20:32 浏览: 92
好的,以下是用C语言写的分治法快速排序代码:
```
#include <stdio.h>
void quick_sort(int arr[], int left, int right);
int partition(int arr[], int left, int right);
int main() {
int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
int len = sizeof(arr) / sizeof(int);
quick_sort(arr, 0, len - 1);
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
void quick_sort(int arr[], int left, int right) {
if (left < right) {
int pivotIndex = partition(arr, left, right);
quick_sort(arr, left, pivotIndex - 1);
quick_sort(arr, pivotIndex + 1, right);
}
}
int partition(int arr[], int left, int right) {
int pivot = arr[right];
int i = left - 1;
for (int j = left; j <= right - 1; j++) {
if (arr[j] < pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[right];
arr[right] = temp;
return i + 1;
}
```
该代码使用分治法的思想,将数组分为两部分进行排序,基准元素是数组的最后一个元素。
首先,设定left和right为当前需要排序的数组下标范围。如果left >= right,则直接返回,不需要排序。将最后一个元素设为基准元素,将数组在基准元素左边的元素设为小于基准元素的部分,右边的部分则大于基准元素。
使用i变量记录小于基准元素的部分的末尾下标,初始值为left - 1。使用j变量遍历整个数组,如果当前的元素小于基准元素,则将i向右移动一位,并将当前元素和i所指的元素进行交换。最终将i + 1所指的元素和基准元素进行交换,完成一次排序。将i + 1作为新的左边界,递归调用quick_sort函数,对左半部分进行排序。将i + 1作为新的右边界,递归调用quick_sort函数,对右半部分进行排序。
最终得到一个有序的数组。
阅读全文