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日

相关文章

  • Flutter Dart快速排序算法示例详解

    Flutter Dart快速排序算法示例详解 介绍 快速排序是一种排序算法,其基本思想是选择一个基准元素,将数组分成两个子数组,其中一个子数组的元素都比基准元素小,另一个子数组的元素都比基准元素大。然后递归地对两个子数组进行快速排序。 实现步骤 选择一个基准元素,并将其从数组中移除。 遍历数组,将小于基准元素的元素放入一个新的左侧数组中,大于基准元素的元素放…

    算法与数据结构 2023年5月19日
    00
  • C#实现希尔排序

    C#实现希尔排序攻略 简介 希尔排序(Shell Sort)是插入排序的一种改进版本,也称为缩小增量排序(Diminishing Increment Sorting)。希尔排序首先将要排序的序列分成若干个子序列,分别进行插入排序,待子序列基本有序时,再对全体记录进行一次直接插入排序。其算法主要思想是将原序列按一定间隔分为若干子序列,对每个子序列分别进行插入排…

    算法与数据结构 2023年5月19日
    00
  • java如何给对象按照字符串属性进行排序

    在 Java 中,我们可以使用 Collections.sort() 方法对任意类型的对象进行排序。但是,如果我们想要按照对象的某一个字符串属性进行排序,我们可以使用 Comparator 接口来实现。 具体步骤如下: 首先,创建一个 Comparator 对象,重写 compare() 方法,按照需要的属性进行排序。例如,如果我们要按照对象的 name 属…

    算法与数据结构 2023年5月19日
    00
  • Java实现插入排序,希尔排序和归并排序

    Java实现插入排序、希尔排序和归并排序 插入排序 插入排序算法的思路是:将一个待排序的数组(序列)分为两部分,前面的有序序列和后面的无序序列,将无序序列中的每一个元素插到有序序列中的适当位置,直到无序序列为空。 Java代码实现: public static void insertionSort(int[] arr) { int i, j, temp; f…

    算法与数据结构 2023年5月19日
    00
  • 修复IE9&safari 的sort方法

    修复IE9和Safari的sort()方法需要遵循以下步骤: 1. 检查代码 要修复排序方法,首先需要检查代码,找出可能存在的问题。请确保你的代码中使用的是正确的sort()方法,并且没有拼写错误和语法问题。同时,还要检查你的代码能否适用于所有浏览器。 2. 自定义排序方法 当浏览器不支持sort()方法时,我们可以自定义一个排序方法来替代它。我们可以使用J…

    算法与数据结构 2023年5月19日
    00
  • 纯python实现机器学习之kNN算法示例

    首先我们需要清楚kNN算法的基本思想。kNN算法是一种基于实例的有监督学习算法,可以用于分类和回归问题。对于一个新的未标记数据,该算法会根据其与训练集中数据的距离,找到距离该点最近的k个点,然后根据这k个点的标签或者值来对该点进行分类或回归。 以下是具体实现步骤: 准备数据 kNN算法需要一个已经标记好的训练数据集。这里我们以Iris花卉数据集为例。我们先把…

    算法与数据结构 2023年5月19日
    00
  • PHP抽奖算法程序代码分享

    关于“PHP抽奖算法程序代码分享”的完整攻略,我将会从以下方面进行讲解: 什么是抽奖算法? 如何设计抽奖算法? 实现代码分享及示例说明 什么是抽奖算法? 抽奖算法是指通过一定的算法,实现在一些参与者中选出一个或几个”幸运儿”的过程。 如何设计抽奖算法? 抽奖算法设计的主要目的就是为了确保公平,同时符合某些要求。在比较公平的情况下,抽奖过程也应该是越来越具备娱…

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

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

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