c语言写快速排序代码

简介: c语言写快速排序代码

一、快速排序

快速排序是一种基于比较的排序算法,可以在平均情况下运行时间为o(n log n),是最常使用的快速、通用的排序算法之一。这个算法的基本思想是选择一个元素作为“枢轴”(通常是数组中的第一个或最后一个元素),然后将数组中的所有其他元素与枢轴进行比较,把小于等于枢轴的元素放到一个子数组中,把大于枢轴的元素放到另一个子数组中,在对每个子数组递归地应用此过程,直到子数组只有零个或一个元素,最后将子数组按顺序连接起来即可得到排序后的数组。

具体步骤如下:

  • 选择枢轴元素,通常是第一个元素或最后一个元素。
  • 将数组分成两个子数组,根据枢轴元素将小于等于枢轴元素的元素放在左边的子数组中,将大于枢轴元素的元素放在右边的子数组中。
  • 对左右子数组递归执行快速排序操作。
  • 最后将左、枢轴、右三部分连接起来即为排序结果。
    这个算法的性能取决于所选择的枢轴元素,理想情况下每次都能够选择到位于数组正中间的元素作为枢轴,此时快速排序算法的时间复杂度为o(n log n)。但是如果每次选到的枢轴都离两端比较远,则可能会导致算法效率降低,时间复杂度达到o(n^2)。因此,在实际应用中,通常会采用一些优化策略来提高算法性能

以下是C语言实现的快速排序算法:

二、代码实现

#include <stdio.h>  

// 交换两个元素的值  
void swap(int *a, int *b) {
     
    int temp = *a;  
    *a = *b;  
    *b = temp;  
}  

// 分割函数,将数组分成左右两部分,并返回左右指针  
int partition(int arr[], int low, int high) {
     
    int pivot = arr[high]; // 选取最后一个元素作为基准值  
    int i = (low - 1); // i指向左边界  

    for (int j = low; j < high; j++) {
     
        if (arr[j] <= pivot) {
     
            i++;  
            int temp = arr[i];  
            arr[i] = arr[j];  
            arr[j] = temp;  
        }  
    }  

    int temp = arr[i + 1];  
    arr[i + 1] = arr[high];  
    arr[high] = temp;  

    return (i + 1); // 返回基准值的位置  
}  

// 快速排序函数  
void quickSort(int arr[], int low, int high) {
     
    if (low < high) {
     
        int pivot = partition(arr, low, high); // 选取基准值  
        quickSort(arr, low, pivot - 1); // 对左边部分递归排序  
        quickSort(arr, pivot + 1, high); // 对右边部分递归排序  
    }  
}  

int main() {
     
    int arr[] = {
   5, 2, 8, 3, 9, 1, 6};  
    int n = sizeof(arr) / sizeof(arr[0]);  

    quickSort(arr, 0, n - 1);  

    printf("排序后的数组:\n");  
    for (int i = 0; i < n; i++) {
     
        printf("%d ", arr[i]);  
    }  
    printf("\n");  

    return 0;  
}

在上面的代码中,swap函数用于交换两个元素的值,partition函数用于将数组分成左右两部分,并返回左右指针,quickSort函数是快速排序的主要函数,用于递归地对数组进行排序。在main函数中,我们定义了一个整数数组,并调用quickSort函数对其进行排序。最后,我们输出排序后的数组。

方法二:

#include <stdio.h>

void quicksort(int *arr, int left, int right) {
   

  if (left < right) {
   

    int pivot = arr[right];
    int i = left - 1;
    int temp;

    for (int j = left; j < right; j++) {
   
      if (arr[j] <= pivot) {
   
        i++;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    }

    i++;
    temp = arr[i];
    arr[i] = pivot;
    arr[right] = temp;

    quicksort(arr, left, i-1);
    quicksort(arr, i+1, right);

  }
}

int main() {
   

  int arr[] = {
   4, 2, 1, 6, 3, 5};
  int n = sizeof(arr)/sizeof(int);

  quicksort(arr, 0, n-1);

  printf("Sorted array: ");
  for (int i = 0; i < n; i++) {
   
    printf("%d ", arr[i]);
  }

  return 0;
}

快速排序的主体是 quicksort 函数,它接受三个参数:一个整数数组 arr、数组的左边界 left 和数组的右边界 right。然后在函数内部使用了递归来进行分割和排序。

在 quicksort 函数中,首先判断左右指针是否相等,如果不相等就进入排序过程。

选择作为 pivot 的元素是 arr[right],在 i 和 j 指针的移动过程中,较小的元素被放在了 [left, i-1] 区间内,i 指向下一个要交换的位置。最后将 pivot 元素归位。

最后递归地对左右两个区间进行排序,直到任务处理完毕。

当 quicksort 函数执行时,它会打印经过排序后的

相关文章
|
9天前
|
存储 数据可视化 C语言
【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】
【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】
|
6天前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
13天前
|
人工智能 Rust 安全
DARPA计划“消灭”C语言代码
为了加速软件业向内存安全编程语言的过渡,美国国防高级研究计划局(DARPA)正在推动一个名为TRACTOR的人工智能代码转换工具,可自动将遗留C代码转换为Rust,以根治内存安全问题。TRACTOR是TRanslating All C TO Rust的缩写,即“将所有C语言代码转换为Rust语言”。
DARPA计划“消灭”C语言代码
|
6天前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
6天前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
6天前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
2月前
|
机器学习/深度学习 C语言 Windows
C语言的管理系统代码
C语言学生宿舍管理系统代码
|
2月前
|
算法 编译器 C语言
猜数字游戏C语言代码实现
猜数字游戏C语言代码实现
|
2月前
|
存储 机器学习/深度学习 编译器
C语言代码学习笔记
<编程精粹:编写高质量C语言代码> 读书笔记
|
2月前
|
存储 安全 Serverless
扫雷游戏C语言代码实现——万字长文超详细,手把手教你实现,新手也能学会
扫雷游戏C语言代码实现——万字长文超详细,手把手教你实现,新手也能学会