C语言 | 一分钟认识快速排序算法

简介: 文章目录• 1.快速排序简介• 2.快速排序思路• 3.快速排序演示• 4.快速排序代码实现思路• 5.快速排序代码1.快速排序简介快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。其具有在绝大多数情况下相当优异的性能2.快速排序思路1.首先,我们在数组中任取一数------通常称其为关键数据(key),通常会挑数组中最后或者第一个数据来作为key.2.而后我们设置两个变量i,j分别指代第一个数据与最后一个数据a[i],a[j],其中,j从最后的数据往前遍历,直到遇到第一个

文章目录

1.快速排序简介

快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。其具有在绝大多数情况下相当优异的性能

2.快速排序思路

1.首先,我们在数组中任取一数------通常称其为关键数据(key),通常会挑数组中最后或者第一个数据来作为key.2.而后我们设置两个变量i,j分别指代第一个数据与最后一个数据a[i],a[j],其中,j从最后的数据往前遍历,直到遇到第一个比key大的数据,而i从0开始遍历数组,直到遇到第一个比key小的数据为止,随后二者数据交换,然后再重复以上操作,最后即可将比key小的数据全部置于key前,而比key大的数据置于key后.

3.随后我们在前后区间内再重复以上操作,同样取分别取第一个数为key,同样分别在前后区间进行2的操作,最后我们便可得到有序的数据.

3.快速排序演示

假设一开始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。

此时,key=5,i=1,j=11,从后往前找,第一个比5小的数是x8=2,因此序列为:2,3,7,6,4,1,0,5,9,10,8。

此时i=1,j=8,从前往后找,第一个比5大的数是x3=7,因此序列为:2,3,5,6,4,1,0,7,9,10,8。

此时,i=3,j=8,从第8位往前找,第一个比5小的数是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。

此时,i=3,j=7,从第3位往后找,第一个比5大的数是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。

此时,i=4,j=7,从第7位往前找,第一个比5小的数是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。

此时,i=4,j=6,从第4位往后找,直到第6位才有比5大的数,这时,i=j=6,key成为一条分界线,它之前的数都比它小,之后的数都比它大,对于前后两部分数,可以采用同样的方法来排序。

4.快速排序代码实现思路

首先,我们需要单独编写一个交换函数以方便交换操作

voidswap(int*x,int*y)
{
intt=*x;
*x=*y;
*y=t;
}

其次,我们可以利用循环执行比较与交换的操作.

而后运用递归执行两个前后区间中重复的操作.

5.快速排序代码

#include<stdio.h>voidswap(int*x,int*y)
{
intt=*x;
*x=*y;
*y=t;
}
voidQuickSort(int*a, intleft, intright)
{
if (left>=right)//如果区间只剩一个数或没有数就不进行操作return;
intkey=Sortonce(a, left, right);//调用排序函数,取key的位置QuickSort(a, left, key-1);//递归调用,对左区间进行排序QuickSort(a, key+1, right);//递归调用,对右区间进行排序}
intSortonce(int*a, intleft, intright)
{
intkey=left;//取最左边的元素做keywhile (left<right)//当左右没有相遇    {
while (left<right&&a[right] >=a[key])//如果右比key小就退出循环right--;
while (left<right&&a[left] <=a[key])//如果左比key大就退出循环left++;
swap(&a[left],&a[right]);//交换左右    }
swap(&a[key], &a[left]);//交换key和相遇位置的元素returnleft;//返回key的位置}
voidmain()
{
inti;
inta[] = {5,9,7,3,2,1,4,87,66,54,23,15,64,57,77,22,113};//测试案例QuickSort(a, 0, 17);
for (i=0; i<18; i++)
printf("%d\n",a[i]);
}
相关文章
|
20天前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
30 1
|
1月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
55 4
|
21天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
115 61
|
4月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
112 1
|
19天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
20天前
|
存储 缓存 算法
C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力
本文探讨了C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力。文章还分析了数据结构的选择与优化、算法设计的优化策略、内存管理和代码优化技巧,并通过实际案例展示了C语言在排序和图遍历算法中的高效实现。
40 2
|
20天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
20天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
49 1
|
1月前
|
存储 算法 数据管理
C语言算法复杂度
【10月更文挑战第20天】
C语言算法复杂度
|
2月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
32 1