c语言如何快速排序

c语言如何快速排序

C语言快速排序方法:掌握分治法、选择合适的枢轴、递归实现

快速排序是一种高效的排序算法,其核心思想是分治法。通过选择一个枢轴元素,将数组划分为两部分,分别排序,再合并。为了实现快速排序,我们需要关注以下几个关键点:选择合适的枢轴、正确划分数组、递归实现排序。下面,我们将详细介绍这些步骤,并提供具体的实现代码。

一、选择合适的枢轴

选择枢轴是快速排序的关键步骤,枢轴的选择直接影响算法的性能。常见的方法包括选择第一个元素、最后一个元素、随机选择和三数取中法。

1.1、选择第一个元素或最后一个元素

选择第一个或最后一个元素作为枢轴是最简单的方法,但在某些情况下可能导致最坏的时间复杂度。

// 选择第一个元素作为枢轴

int pivot = array[low];

// 选择最后一个元素作为枢轴

int pivot = array[high];

1.2、随机选择枢轴

随机选择枢轴可以避免最坏情况的出现,但需要额外的随机数生成开销。

// 随机选择枢轴

srand(time(NULL));

int pivotIndex = low + rand() % (high - low + 1);

int pivot = array[pivotIndex];

1.3、三数取中法

三数取中法通过选择三个数(通常是第一个、最后一个和中间的元素),取中间值作为枢轴。这种方法能有效提高算法的性能。

// 三数取中法选择枢轴

int mid = low + (high - low) / 2;

int pivot = median(array[low], array[mid], array[high]);

二、正确划分数组

划分数组的目的是将比枢轴小的元素放在左边,比枢轴大的元素放在右边。常用的划分算法有Hoare划分方案和Lomuto划分方案。

2.1、Hoare划分方案

Hoare划分方案通过两个指针从数组两端向中间扫描,交换不符合条件的元素。

int hoarePartition(int array[], int low, int high) {

int pivot = array[low];

int i = low - 1;

int j = high + 1;

while (1) {

do {

i++;

} while (array[i] < pivot);

do {

j--;

} while (array[j] > pivot);

if (i >= j)

return j;

swap(&array[i], &array[j]);

}

}

2.2、Lomuto划分方案

Lomuto划分方案使用一个指针遍历数组,将小于枢轴的元素交换到前面。

int lomutoPartition(int array[], int low, int high) {

int pivot = array[high];

int i = low - 1;

for (int j = low; j < high; j++) {

if (array[j] < pivot) {

i++;

swap(&array[i], &array[j]);

}

}

swap(&array[i + 1], &array[high]);

return i + 1;

}

三、递归实现排序

递归实现快速排序是分治法的具体应用,通过递归调用快速排序函数,将数组不断划分并排序,直到数组不可再分。

3.1、递归实现快速排序

void quickSort(int array[], int low, int high) {

if (low < high) {

int pi = hoarePartition(array, low, high);

quickSort(array, low, pi);

quickSort(array, pi + 1, high);

}

}

3.2、完整代码示例

下面是完整的快速排序代码示例,包括数组划分、递归排序和辅助函数。

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

// 交换两个元素

void swap(int* a, int* b) {

int temp = *a;

*a = *b;

*b = temp;

}

// 三数取中

int median(int a, int b, int c) {

if ((a > b) != (a > c)) return a;

else if ((b > a) != (b > c)) return b;

else return c;

}

// Hoare划分方案

int hoarePartition(int array[], int low, int high) {

int pivot = array[low];

int i = low - 1;

int j = high + 1;

while (1) {

do {

i++;

} while (array[i] < pivot);

do {

j--;

} while (array[j] > pivot);

if (i >= j)

return j;

swap(&array[i], &array[j]);

}

}

// 快速排序函数

void quickSort(int array[], int low, int high) {

if (low < high) {

int pi = hoarePartition(array, low, high);

quickSort(array, low, pi);

quickSort(array, pi + 1, high);

}

}

// 打印数组

void printArray(int array[], int size) {

for (int i = 0; i < size; i++)

printf("%d ", array[i]);

printf("n");

}

int main() {

int array[] = {10, 7, 8, 9, 1, 5};

int n = sizeof(array) / sizeof(array[0]);

quickSort(array, 0, n - 1);

printf("Sorted array: n");

printArray(array, n);

return 0;

}

通过以上步骤和代码示例,我们详细介绍了C语言实现快速排序的方法。快速排序算法通过选择合适的枢轴、正确划分数组,并递归实现排序,在大多数情况下表现出色,是一种非常高效的排序算法。选择合适的枢轴、正确划分数组、递归实现排序是快速排序的核心要点,希望这篇文章能够帮助你更好地理解和实现快速排序。

相关问答FAQs:

1. 什么是快速排序算法?

快速排序是一种常用的排序算法,它通过将待排序的数据分成两个子序列,然后对这两个子序列分别进行排序,最后再合并成一个有序的序列。

2. 快速排序算法的原理是什么?

快速排序算法的原理是通过选取一个基准元素,将待排序序列分为两部分,其中一部分元素小于基准元素,另一部分元素大于基准元素。然后递归地对这两部分进行排序,最终得到一个有序的序列。

3. 快速排序算法的时间复杂度是多少?

快速排序算法的时间复杂度为O(nlogn),其中n是待排序序列的长度。快速排序是一种高效的排序算法,适用于大规模数据的排序。

原创文章,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/1167075

(0)
Edit2Edit2
上一篇 2024年8月29日 下午2:31
下一篇 2024年8月29日 下午2:31
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部