【基础知识】之 快排(quick sorting)
算法复习。
时间复杂度:
平均情况 O(n*log2n)
最坏情况 O(n2)
最好情况 O(n*log2n)
思路:
设待排序的数组为a,长度为n,起始i=0,j=n-1。对于每一轮快排:
1、从右往左(j--的方向)查找到比key(一般设定为a[0])小的值,然后将a[i]与a[j]交换。
2、从左往右(i++的方向)查找比key大的值,将a[i]与a[j]交换。
3、一直执行1、2步骤,直到i>j。此时,key的左边为比key小的值,key的右边为比key大的值。然后再分别递归左半边array和右半边array。直到递归的终止条件(i>=j)满足,则停止递归。
代码:
#include <iostream> using namespace std; /*输出指定范围内的数组元素*/ void showArray(int arr[], int start, int end){ for(int i = start; i <= end; i++){ cout << arr[i] << " "; } cout << endl; } /*交换指定位置的数组中的元素的值*/ void swap(int arr[],int a, int b){ int temp = 0; temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } /*快排函数*/ void sortUnit(int arr[],int i, int j){ if(i >= j){ return; } int key = arr[i]; int start = i; int end = j; int temp = 0; while(i < j){ while(arr[j] >= key && j > i){ j--; } if(arr[j] < key){ swap(arr,i,j); } while(arr[i] <= key && i < j){ i++; } if(arr[i] > key){ swap(arr,i,j); } } int center = (i + j)/2; /* 辅助功能,输出数据查看是否正确 */ showArray(arr, start, end); cout << "center index = " << center << " ,center value = " << arr[center] << endl << endl; /*递归快排左半边*/ sortUnit(arr, start, center - 1); /*递归快排右半边*/ sortUnit(arr, center + 1, end); } void main(){ int n = 20;//设定测试数组长度为20 int arr[20] = {0};//初始化数组 for(int i = 0; i < n; i++){ cin >> arr[i]; } sortUnit(arr,0,n-1); //查看最终结果 showArray(arr, 0, n-1); }
代码测试:
测试数据:
用matlab随机产生一个1*20的向量,范围为(1,100)。
>> a=randi([1,100],1,20)
向量为:
66 4 85 94 68 76 75 40 66 18 71 4 28 5 10 83 70 32 96 4
输出:
分类:
基础知识
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构