C语言的快速排序程序

时间: 2023-09-03 09:27:10 浏览: 102
### 回答1: 快速排序是一种常用的排序算法。它的工作原理是: 1. 在数列中找到一个基准数(通常是数列的第一个数)。 2. 将数列中所有比基准数小的数放在基准数的左边,所有比基准数大的数放在基准数的右边。 3. 对基准数左边和右边的两个数列分别执行步骤 1 和 2,直到所有数都排好序为止。 下面是一个 C 语言实现的快速排序程序: ``` #include <stdio.h> void quick_sort(int a[], int left, int right) { int i, j, t, temp; if (left > right) return; temp = a[left]; // 基准数 i = left; j = right; while (i != j) { // 从右向左找第一个小于基准数的数 while (a[j] >= temp && i < j) j--; // 从左向右找第一个大于基准数的数 while (a[i] <= temp && i < j) i++; // 交换两个数 if (i < j) { t = a[i]; a[i] = a[j]; a[j] = t; } } // 最终将基准数归位 a[left] = a[i]; a[i] = temp; // 继续处理左边的数列 quick_sort(a, left, i - 1); // 继续处理右边的数列 quick_sort(a, i + 1, right); } int main() { int i; int a[] = {50, 10, 90, 30, 70, 40, 80, 60, 20}; quick_sort(a, 0, 8); for (i = 0; i < 9; i++) printf("%d ", a[i]); return 0; } ``` ### 回答2: 快速排序是一种常用的排序算法,通过不断地选取一个基准值,将数组分成两部分,一部分小于基准值,一部分大于基准值,然后对两个子数组分别进行递归排序,最终实现整个数组的排序。 下面是一个用C语言编写的快速排序程序的示例: ```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; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return i + 1; } void quickSort(int arr[], int low, int high) { if (low < high) { int pivotIdx = partition(arr, low, high); quickSort(arr, low, pivotIdx - 1); quickSort(arr, pivotIdx + 1, high); } } int main() { int arr[] = {7, 2, 9, 3, 6, 1, 5, 8, 4}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } quickSort(arr, 0, n - 1); printf("\n排序后的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 以上程序实现了快速排序算法。首先定义了一个用于交换数组元素的辅助函数swap,然后定义了一个用于将数组分区的函数partition。在partition函数中,选择最后一个元素作为基准值,然后通过比较和交换操作,将小于基准值的元素放在基准值左侧,大于基准值的元素放在基准值右侧,并返回基准值的索引。最后,在quickSort函数中,根据基准值的索引,将数组分为两部分,分别对这两个子数组进行递归排序。 在main函数中,定义了一个示例数组arr,并根据数组的长度确定排序的范围。首先打印未排序的数组,然后调用quickSort函数进行排序,最后打印排序后的数组。运行程序,可以看到输出结果为:1 2 3 4 5 6 7 8 9,即为排序后的数组。 ### 回答3: 快速排序是一种常见的排序算法,它采用分治的思想来实现排序。下面是一个用C语言编写的快速排序程序示例: ``` #include <stdio.h> // 交换两个元素的值 void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } // 将数组分为两部分,并返回分割点下标 int partition(int arr[], int low, int high) { // 将最右边的元素作为基准值 int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high - 1; j++) { // 如果当前元素小于或等于基准值,进行交换 if (arr[j] <= pivot) { i++; swap(&arr[i], &arr[j]); } } // 将基准值放到正确的位置上 swap(&arr[i + 1], &arr[high]); return (i + 1); } // 实现快速排序 void quickSort(int arr[], int low, int high) { if (low < high) { // 获取分割点下标 int pi = partition(arr, low, high); // 对分割点左右两边的子数组进行递归排序 quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // 打印数组元素 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } // 测试快速排序程序 int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前的数组: "); printArray(arr, n); quickSort(arr, 0, n - 1); printf("排序后的数组: "); printArray(arr, n); return 0; } ``` 这个程序中,我们首先定义了一个交换函数`swap`,用于交换两个元素的值。然后定义了一个分割函数`partition`,它选择一个基准值,将数组分为两部分,并返回基准值的下标。接着,我们实现了快速排序函数`quickSort`,通过递归调用`partition`函数来不断对子数组进行排序。最后,在`main`函数中,我们测试了这个快速排序程序,对一个示例数组进行排序,并打印出排序前后的结果。 快速排序的时间复杂度为O(nlogn),是一种高效的排序算法。它通过不断地将数组分成较小的子数组,并递归地对子数组进行排序,从而实现了整个数组的排序。

相关推荐

最新推荐

recommend-type

用C语言实现成绩表的快速排序程序设计

问题描述〕给出n个学生的1门课程的考试成绩信息,每条信息由姓名 与分数组成,要求设计快速排序算法,进行: (1)按成绩排序; (2)输出形式为:张强 张平 曾芽 王华 孙军 李应 程滨 90 88 82 78 70 69 65 〔...
recommend-type

用C语言实现常用排序算法

利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并且 (1) 统计每一种排序上机所花费的时间。 (2) 统计在完全正序,完全逆序情况下记录的比较...
recommend-type

Python源码-数学美之樱花.py

Python源码-数学美之樱花
recommend-type

蚁群算法(ACO)求解TSP问题,MATLAB源码,代码注释详细,可根据自身需求拓展应用

蚁群算法(ACO)求解TSP问题,MATLAB源码,代码注释详细,可根据自身需求拓展应用
recommend-type

2024年5月最新采集大众点评全国(内地)-学习培训大类-店铺基础信息,93余万家

2024年5月最新采集大众点评全国(内地)-学习培训大类-店铺基础信息,93余万家。此处仅展示1万家,全量也有。 2024年5月最新大众点评店铺基础信息采集。含美食、休闲娱乐、结婚、电影演出赛事、丽人、酒店、亲子、周边游、运动健身、购物、家装、学习培训、医疗健康、爱车、宠物等十几大类共几千万家店铺信息。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。