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 函数执行时,它会打印经过排序后的

相关文章
|
1月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
53 4
|
1月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
57 4
|
4月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
148 1
|
21天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
28天前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
22天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
2月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
2月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
2月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
61 4