c语言快速排序算法示例代码分享

首先,我们需要了解什么是快速排序。快速排序(QuickSort)是一种排序算法,其采用了分治的思想,并使用递归的方式处理数据集合。它的基本思想是从待排序的数据集合中选择一个元素作为分界点(一般称为pivot),然后将小于pivot的元素放到pivot左边,大于pivot的元素放到pivot右边,最后将pivot放到中间位置。然后递归处理pivot左右两边的子数组,直到所有的元素都被遍历过为止。

下面我们来看一下C语言的快速排序示例代码:

#include <stdio.h>

//定义快速排序函数
void quickSort(int arr[], int low, int high) {
    int i, j, temp, pivot;
    if (low < high) {
        pivot = low;
        i = low;
        j = high;
        while (i < j) {
            //从右边开始找到第一个小于pivot的元素
            while (arr[j] > arr[pivot]) {
                j--;
            }
            //从左边开始找到第一个大于pivot的元素
            while (i < j && arr[i] <= arr[pivot]) {
                i++;
            }
            //交换i和j位置的元素
            if (i < j) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        //将pivot移到中间位置
        temp = arr[pivot];
        arr[pivot] = arr[j];
        arr[j] = temp;
        //递归处理pivot左右两边的子数组
        quickSort(arr, low, j - 1);
        quickSort(arr, j + 1, high);
    }
}

//测试代码
int main() {
    int arr[] = { 5, 1, 9, 3, 7, 4, 8, 6, 2 };
    int len = sizeof(arr) / sizeof(*arr);
    printf("Original array: ");
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    quickSort(arr, 0, len - 1);
    printf("Sorted array: ");
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

该示例代码中,我们自定义了一个快速排序函数quickSort(),传入数组arr、数组最小索引值low、数组最大索引值high三个参数,用于处理待排序的数组。

在函数内部,我们首先判断low是否小于high,如果是,则进行一些操作。接着定义pivot作为我们选择的分界点,ij分别代表数组左右两个指针位置,开始从arr[low]作为pivot,然后我们从右边开始找到第一个小于pivot的元素,从左边开始找到第一个大于pivot的元素,然后交换ij位置的元素,直到ij相遇。最后将pivot移到中间位置,并递归处理pivot左右两边的子数组。

我们在main()函数中调用了quickSort()函数来实现排序。在测试代码中,我们定义了一个整型数组arr,并打印了原始顺序的数组arr,随后调用quickSort()函数对该数组进行排序,并打印排序后的结果。

下面我们来看看快速排序的算法复杂度:

最优情况下,时间复杂度为O(nlogn)。

最坏情况下,时间复杂度为O(n^2)。

平均情况下,时间复杂度为O(nlogn)。

下面我将会给出另一条示例:

#include<stdio.h>

//定义快速排序函数
void quickSort(int arr[], int left, int right) {
    if (left<right){
        int i = left, j = right, pivot = arr[left];
        while (i<j)
        {
            while (i<j&&arr[j]>=pivot)j--;//从右向左找第一个小于x的数  
            if (i<j)
            arr[i++] = arr[j];
            while (i<j&&arr[i]<pivot)i++;//从左向右找第一个大于等于x的数  
            if (i<j)
            arr[j--] = arr[i];
        }
        arr[i] = pivot;
        quickSort(arr, left, i - 1);
        quickSort(arr, i + 1, right);
    }
}

//测试代码
int main(){
    int arr[] = { 6,1,2,7,9,3,4,5,10,8 };
    int len = sizeof(arr) / sizeof(*arr);
    printf("Original array:");
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    quickSort(arr, 0, len - 1);
    printf("Sorted array:");
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

该示例与上一条示例代码类似,同样是通过一次扫描数组递归处理的方式进行排序。但是该示例对于右端点元素的选择略有不同,这次我们选择了数组的最左端点元素为枢轴。又在交换元素时进行了优化。

属于一种更灵活的实现方式。

我们可通过执行该示例代码来检验一下结果是否与预期相符。

以上就是C语言快速排序算法示例代码的分享内容,希望能够帮助到大家。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言快速排序算法示例代码分享 - Python技术站

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

相关文章

  • C++递归实现选择排序算法

    实现选择排序算法的递归版本,步骤如下: 步骤1:找到最小值 首先,在要排序的数组中找到最小值,这个过程可以用for循环来实现。具体实现如下: // 找到数组中最小值的下标 int findMinIndex(int arr[], int startIndex, int endIndex) { int minIndex = startIndex; for (in…

    算法与数据结构 2023年5月19日
    00
  • Java分治归并排序算法实例详解

    Java分治归并排序算法实例详解 什么是分治归并排序算法 分治法是一种算法解决问题的思想,即将一个问题分成若干个小问题,再将小问题分成更小的子问题,直到最后子问题可以很容易地直接求解,原问题的解即子问题的解的合并。归并排序算法采用了分治法思想,将一个要排序的数组分成两个小数组,再将这两个小数组分别排序,最终合并两个有序小数组成为一个有序大数组。 算法流程 分…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现经典排序算法之冒泡排序

    JavaScript实现经典排序算法之冒泡排序 什么是冒泡排序? 冒泡排序是一种简单的排序算法,从序列左侧开始比较两个相邻的元素,如果顺序不对就交换位置,直到序列末尾,这样一次遍历后,序列最后一个元素就是当前序列最大值。然后对剩余序列重复上述过程,直到整个序列有序。 算法实现 我们来看看如何用JavaScript实现冒泡排序。 function bubble…

    算法与数据结构 2023年5月19日
    00
  • Python实现的最近最少使用算法

    Python实现最近最少使用算法 最近最少使用算法(Least Recently Used,LRU)是一种缓存淘汰策略,用于在缓存已满时选择要被淘汰的缓存块。该算法的基本思想是,当缓存已满时,淘汰最近最少使用的缓存块。 下面我们将通过python代码实现LRU算法的主要思想,并提供两个示例说明。 算法思路 LRU算法需要同时维护两个数据结构。 记录最近访问顺…

    算法与数据结构 2023年5月19日
    00
  • JS使用单链表统计英语单词出现次数

    下面是JS使用单链表统计英语单词出现次数的完整攻略。 1. 理解单链表 单链表是一种常见的数据结构,也是一种线性结构,其中每个节点只有一个指针,指向它的后继节点。单链表一般由头指针和头结点组成,头结点不存放任何实际数据。在单链表中,节点可以进行插入、删除、查找等基本操作,是一种十分常用的数据结构。 2. 思路分析 要使用单链表统计英语单词出现次数,可以将单词…

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

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

    算法与数据结构 2023年5月19日
    00
  • C语言实现数组元素排序方法详解

    C语言实现数组元素排序方法详解 概述 数组元素排序是C语言中常见的操作,它将数组中的元素按照一定的规则进行排序,使其符合特定的要求。常见的排序方法包括冒泡排序、插入排序、选择排序、快速排序等。 本文将详细讲解C语言实现数组元素排序的方法,包括上述四种排序方法的原理、代码实现,帮助初学者快速入门。 冒泡排序 冒泡排序是一种简单的排序方法,它依次比较相邻的两个元…

    算法与数据结构 2023年5月19日
    00
  • Go归并排序算法的实现方法

    Go归并排序算法的实现方法 简介 归并排序(Merge Sort)是一种经典的分治算法,它将一个大问题分解为若干个小问题,通过递归将小问题排好序,最后再将小问题合并起来,得到排序的结果。 归并排序的最坏时间复杂度为$ O(nlogn)$,且具有稳定性,是较为优秀的排序算法之一。 实现方法 归并排序的实现分为两个步骤,分别是分解和合并: 分解 分解过程需要递归…

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