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日

相关文章

  • Linux静态链接库使用类模板的快速排序算法

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

    算法与数据结构 2023年5月19日
    00
  • PHP面试常用算法(推荐)

    对于“PHP面试常用算法(推荐)”这一话题,我可以给出一个较为完整的攻略,如下: PHP面试常用算法(推荐) 1.算法的定义 算法(Algorithm)是指解决问题的方法和步骤,也就是解决问题的具体步骤和策略。算法包括很多种,比如常见的排序算法、查找算法、递归算法等等。在 PHP 的面试中,算法是一个非常重要的考察内容,因此熟练掌握各种算法的基本原理和实现方…

    算法与数据结构 2023年5月19日
    00
  • 利用C++的基本算法实现十个数排序

    利用C++的基本算法实现十个数排序 1. 算法选择 排序问题常见的算法有冒泡排序、插入排序、选择排序、快速排序等,它们的时间复杂度不尽相同,但在本题目的情况下,十个数的排序任何算法都可以。 为了方便,本文将使用最简单的冒泡排序算法。 2. 代码实现 冒泡排序算法的基本思路是从头到尾扫描一遍数组,比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们…

    算法与数据结构 2023年5月19日
    00
  • JS实现的合并两个有序链表算法示例

    下面为您详细讲解JS实现的合并两个有序链表算法示例的完整攻略。 什么是合并两个有序链表? 合并两个有序链表,顾名思义就是将两个有序链表合并成一个有序链表。具体实现过程是将链表A和链表B按照顺序依次比较,将较小的节点插入到一个新的链表C中,直至A、B中有一个链表被遍历结束,另一个链表中剩余的节点则直接插入到链表C的最后。 示例如下: 链表A 链表B 合并后的链…

    算法与数据结构 2023年5月19日
    00
  • Java中的数组排序方式(快速排序、冒泡排序、选择排序)

    下面是Java中的数组排序方式的完整攻略。 1. 快速排序 快速排序是常用的一种排序算法,其时间复杂度为O(nlogn)。其基本思想是选择一个基准数,将数组分成左右两部分,比基准数小的放在左边,比基准数大的放在右边,然后再对左右两部分分别递归地进行快速排序。 Java中快速排序的实现基于Arrays类的sort方法。下面是一个示例代码: public sta…

    算法与数据结构 2023年5月19日
    00
  • JS实现的排列组合算法示例

    下面我将详细讲解一下JS实现的排列组合算法示例的完整攻略。 算法原理 JS实现的排列组合算法主要基于数学组合学,其核心思想是将需要进行排列组合的数据按照一定规则进行排列组合,得到所有可能的排列组合方式。这里我们首先介绍排列与组合的概念: 排列:从n个不同元素中取出m个元素进行排列,按照一定的顺序排列的所有可能的情况被称为排列。其中,n>m。 组合:从n…

    算法与数据结构 2023年5月19日
    00
  • C#算法之全排列递归算法实例讲解

    C#算法之全排列递归算法实例讲解 什么是全排列? 全排列是指将一个给定的集合中的元素进行排列,使得每个元素只出现一次,且每个元素在排列中的位置是不确定的,从而得到的所有不同排列。比如给定集合{1, 2, 3}的全排列包括{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, 3, 1}、{3, 1, 2}和{3, 2, 1}。 递归算法实现全排列…

    算法与数据结构 2023年5月19日
    00
  • 一道JS前端闭包面试题解析

    下面我来为你讲解一道 JS 前端闭包面试题的完整攻略。 面试题 下面是面试题的题目与内容: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 0); } 要求输出 0, 1, 2, 3, 4,但是实际上却是输出了 5, 5, 5, 5, 5。请问这是为什么?…

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