C语言简明讲解快速排序的应用

C语言简明讲解快速排序的应用

快速排序的概述

快速排序是一种基于比较的排序算法,最初由Tony Hoare于1959年发明,因其在实践中的高效性而受到广泛的应用。快速排序的基本思想是通过不断地分割(partition)和交换(swap)来实现排序,具体来说,就是先选取一个pivot数,然后将序列中小于pivot的数放在pivot左边,大于pivot的数放在pivot右边,最后对pivot左右两个子序列分别进行排序。

快速排序的实现

下面是快速排序的代码实现,在本例中选择数组的最后一个元素作为pivot数:

void quicksort(int *arr, int left, int right) {
  if (left < right) {
    int pivot = arr[right];
    int i = left - 1;
    for (int j = left; j <= right - 1; j++) {
      if (arr[j] < pivot) {
        i++;
        swap(arr+i, arr+j);
      }
    }
    swap(arr+i+1, arr+right);
    int mid = i+1;
    quicksort(arr, left, mid-1);
    quicksort(arr, mid+1, right);
  }
}

void swap(int *a, int *b) {
  int t = *a;
  *a = *b;
  *b = t;
}

快速排序的应用示例1

下面是一个使用快速排序算法解决整数数组去重的示例,即除去数组中的重复元素并排序:

#include <stdio.h>

void quicksort(int *arr, int left, int right);
void swap(int *a, int *b);

int main() {
  int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 7};
  quicksort(arr, 0, 9);
  int s = 0;
  for (int i = 1; i <= 9; i++) {
    if (arr[i] == arr[s]) {
      continue;
    }
    s++;
    arr[s] = arr[i];
  }
  for (int i = 0; i <= s; i++) {
    printf("%d ", arr[i]);
  }
  return 0;
}

void quicksort(int *arr, int left, int right) {
  if (left < right) {
    int pivot = arr[right];
    int i = left - 1;
    for (int j = left; j <= right - 1; j++) {
      if (arr[j] < pivot) {
        i++;
        swap(arr+i, arr+j);
      }
    }
    swap(arr+i+1, arr+right);
    int mid = i+1;
    quicksort(arr, left, mid-1);
    quicksort(arr, mid+1, right);
  }
}

void swap(int *a, int *b) {
  int t = *a;
  *a = *b;
  *b = t;
}

在上面的示例中,我们先对数组进行快速排序,然后再将重复元素去除并输出数组。这里的代码相当简单,就是记录一个索引,不断移动数组元素即可。

快速排序的应用示例2

下面是一个使用快速排序算法查找数组中第k小的数的示例:

#include <stdio.h>

void quicksort(int *arr, int left, int right);
int partition(int *arr, int left, int right);
void swap(int *a, int *b);

int main() {
  int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
  quicksort(arr, 0, 9);
  int k = 4;
  printf("The %dth smallest element is %d.\n", k, arr[k-1]);
  return 0;
}

void quicksort(int *arr, int left, int right) {
  if (left < right) {
    int pivot_pos = partition(arr, left, right);
    quicksort(arr, left, pivot_pos-1);
    quicksort(arr, pivot_pos+1, right);
  }
}

int partition(int *arr, int left, int right) {
  int pivot = arr[right], i = left - 1;
  for (int j = left; j < right; j++) {
    if (arr[j] < pivot) {
      i++;
      swap(arr+i, arr+j);
    }
  }
  swap(arr+i+1, arr+right);
  return i+1;
}

void swap(int *a, int *b) {
  int t = *a;
  *a = *b;
  *b = t;
}

在上面的示例中,我们先对数组进行快速排序,然后再输出数组中第k小的元素,这需要我们稍微修改一下快速排序函数,以便在分割出pivot位置后直接返回该值即可。

总结

通过上面两个应用示例,我们可以看到,快速排序在实际中具有很高的效率和可用性,如果我们能够熟练掌握它,并在实践中合理地应用,将会大大提升我们的编程能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言简明讲解快速排序的应用 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • C++超详细分析优化排序算法之堆排序

    C++超详细分析优化排序算法之堆排序 堆排序算法的思路 堆排序算法是一种树形选择排序算法。它的基本思想是:将待排序的序列构造成一个大根堆(或小根堆),此时,整个序列的最大(或最小)值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大(或最小)值),然后将剩余的n-1个序列重新构造成一个堆,这样,每次找出最大(或最小)值的操作…

    算法与数据结构 2023年5月19日
    00
  • JS折半插入排序算法实例

    下面是介绍JS折半插入排序算法的完整攻略。 什么是折半插入排序算法? 折半插入排序是插入排序的一种改进算法,它的基本思路是利用二分查找找到某个待排元素在已排序序列中插入位置。 折半插入排序算法的时间复杂度为 O(nlogn),比普通插入排序 O(n^2)快。 折半插入排序算法实现步骤 折半插入排序算法的实现步骤如下: 从第二个元素开始,将整个序列分为已排序区…

    算法与数据结构 2023年5月19日
    00
  • 深入了解javascript 数组的sort方法

    深入了解JavaScript数组的sort方法 简介 在JavaScript中,数组(Array)是一个非常常用的数据结构,而sort()是Array原型上的非常常用的方法,可用于排序。数组中的元素可以是任何类型,但在排序时,所有元素都将转换为字符串形式,所以有时打算对不同数据类型的元素进行排序,您可能需要使用自定义比较函数。 基本使用方法 sort()方法…

    算法与数据结构 2023年5月19日
    00
  • c++实现排序算法之希尔排序方式

    C++实现排序算法之希尔排序 前置知识 希尔排序是一种基于插入排序的排序算法 插入排序是一种简单直观的排序算法 算法思路 希尔排序是一种分组插入排序的算法。它的基本思想是:先将待排序序列按照一定规则分成若干子序列,对各个子序列进行插入排序,然后逐步缩小子序列的长度,最终使整个序列成为一个有序序列。 例如,对于一个序列 5 2 8 9 1 3 7 6 4,我们…

    算法与数据结构 2023年5月19日
    00
  • C++ 基本算法 冒泡法、交换法、选择法、实现代码集合

    C++ 基本算法 冒泡法、交换法、选择法 在编程中,基本算法是非常重要的。本文将介绍C++中基本算法的三种实现方式:冒泡排序、交换排序、选择排序,并附上相应的实现代码集合以及示例说明。 冒泡排序 冒泡排序,顾名思义,就像水中的气泡一样,从底部慢慢上升。在排序过程中,每次比较相邻两个元素的大小,如果发现顺序不对,就进行交换,直到所有元素都排列好。冒泡排序的时间…

    算法与数据结构 2023年5月19日
    00
  • C语言 奇偶排序算法详解及实例代码

    C语言奇偶排序算法详解及实例代码 本篇文章将详细讲解C语言中奇偶排序算法的原理、实现方法及具体的实例代码,并通过两个示例说明其使用方法。 原理介绍 奇偶排序算法又叫交替排序算法,是一种简单但较慢的排序算法,通常用于小型数据集中的排序。该算法通过使用两个线程分别对奇数位置和偶数位置的元素进行比较和交换来实现排序。 该算法的原理如下: 从头到尾扫描一遍待排序数组…

    算法与数据结构 2023年5月19日
    00
  • PHP有序表查找之二分查找(折半查找)算法示例

    下面我将对“PHP有序表查找之二分查找(折半查找)算法示例”的完整攻略进行详细讲解。 一、什么是二分查找 二分查找又称为折半查找,是一种在有序数组中查找某一特定元素的搜索算法。基本思想是:将有序数组分成两部分,如果要查找的元素比数组中间的元素小,则在左半部分继续查找;如果要查找的元素比数组中间的元素大,则在右半部分继续查找,直到找到或者查找结束。 二分查找算…

    算法与数据结构 2023年5月19日
    00
  • JS插入排序简单理解与实现方法分析

    JS插入排序简单理解与实现方法分析 描述 插入排序是一种比较简单的排序方法,它的核心思想是将待排序的元素,依次插入到已经排好序的部分,从而逐渐将整个序列排好。具有较好的稳定性和适用性。 实现思路 插入排序的实现思路: 将第一个元素当做已经排序好的序列 从第二个元素开始遍历整个数组 回溯已经排序好的序列,将当前元素插入到比它大的元素之前 重复2、3步骤直到排序…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部