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日

相关文章

  • PHP实现根据数组某个键值大小进行排序的方法

    在PHP中,可以使用内置函数 array_multisort() 来对数组进行排序,并且可以根据某个键值的大小进行排序。下面是实现的步骤: 步骤一:准备数组 首先,需要准备一个包含多个元素的数组。每个元素都是一个关联数组,包含多个键值对。本例中,我们以元素数组中的 age 键值作为排序标准。 示例: $people = array( array("…

    算法与数据结构 2023年5月19日
    00
  • Linux静态链接库使用类模板的快速排序算法

    下面是对“Linux静态链接库使用类模板的快速排序算法”的详细讲解。 简介 静态链接库是一种文件格式,其中包含了许多可共享的目标文件,这些目标文件可以在运行时被动态链接器加载。可以将静态链接库视为预编译的代码,包含在可执行程序中,因此在执行时无需加载库文件,从而提高程序的运行效率。 在Linux下,可以使用静态链接库的方式来实现类模板的快速排序算法,具有较高…

    算法与数据结构 2023年5月19日
    00
  • TF-IDF与余弦相似性的应用(一) 自动提取关键词

    下面我将详细讲解“TF-IDF与余弦相似性的应用(一) 自动提取关键词”的完整攻略。 什么是TF-IDF? TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用于信息检索与分类中的文本特征提取方法,用于评估一段文本中词的重要程度。TF-IDF的核心思想就是:一个词在一篇文档中出现的频次(TF)越高,同时…

    算法与数据结构 2023年5月19日
    00
  • C++ sort排序之降序、升序使用总结

    C++ sort排序之降序、升序使用总结 介绍 sort函数是C++ STL库提供的一种排序函数,可以快速方便地对数组或容器进行排序。本文将详细介绍sort函数的用法,包括排序方式、自定义比较函数和对容器的排序等内容。 基本用法 sort函数的声明如下: template <class RandomAccessIterator> void sor…

    算法与数据结构 2023年5月19日
    00
  • PHP实现二维数组按照指定的字段进行排序算法示例

    下面是详细讲解“PHP实现二维数组按照指定的字段进行排序算法示例”的完整攻略。 问题描述 有一个包含多个元素、每个元素又包含多个键值对的PHP二维数组,现在需要按照指定的某个字段对它们进行排序。怎么实现? 解决方法 我们可以使用PHP的usort()函数来实现。usort()函数是PHP的内置函数,可以通过自定义的排序函数来对数组进行排序。这里我们可以通过编…

    算法与数据结构 2023年5月19日
    00
  • java排序算法图文详解

    Java排序算法图文详解 在Java编程中,排序算法是非常重要且常见的一部分。本文将详细讲解Java中的各种排序算法及其实现,帮助读者了解不同算法的特点和使用场景,提高程序的效率和可读性。 排序算法分类 在Java中,常用的排序算法主要可以分为以下几类: 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 冒泡排序 冒泡排序是一种简单的排序算法,其原理…

    算法与数据结构 2023年5月19日
    00
  • C#常见算法面试题小结

    C#常见算法面试题小结 常见算法 本文主要讲解C#常见算法,在面试或实际工作中应用较为广泛。以下是本文讨论的常见算法: 排序算法 查找算法 贪心算法 动态规划算法 字符串算法 排序算法 冒泡排序 冒泡排序是一种效率低下的排序,但是学习它有助于了解其他的排序算法。 冒泡排序的核心思想是重复地走访过要排序的序列,每次比较相邻的两个元素,如果他们的顺序错误就把他们…

    算法与数据结构 2023年5月19日
    00
  • JS实现的计数排序与基数排序算法示例

    可能需要先说明一下,计数排序和基数排序都是针对整数排序的算法。 1. 计数排序 计数排序的基本思想是将每个元素出现的次数统计出来,并按顺序排列。计数排序不是基于元素比较的,而是建立在元素的值域范围较小的前提下的。因此,计数排序的时间复杂度是O(n+k),其中k是元素的值域大小。 算法步骤 统计每个数字出现的次数,得到一个长度为k的计数数组。 将计数数组进行变…

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