《算法导论》——随机化快排RandomizedQuickSort
今日算法:随机化快排RandomizedQuickSort
基础工作swap交换和partition分治

/* *交换数组的两个元素 *fromIndex和toIndex为要交换的两个元素的索引 */ void swap(int *numArray,int fromIndex,int toIndex) { int temp=numArray[fromIndex]; numArray[fromIndex]=numArray[toIndex]; numArray[toIndex]=temp; } int partition(int *numArray,int head,int tail) { int x=numArray[tail]; int i=head-1; for(int j=head;j<tail;j++) { if(numArray[j]<=x) { i++; swap(numArray,i,j); } } swap(numArray,i+1,tail); return i+1; }
随机选择主元,快排
int randomizedPartition(int *numArray,int head,int tail) { int i=rand()%(tail-head+1)+head; swap(numArray,tail,i); return partition(numArray,head,tail); } void randomizedQuickSort(int *numArray,int head,int tail) { if(head<tail) { int q=randomizedPartition(numArray,head,tail); randomizedQuickSort(numArray,head,q); randomizedQuickSort(numArray,q+1,tail); } }
测试及结果:
#include "stdafx.h" #include <iostream> #include "RandomizedQuickSort.h" using namespace std; using namespace dksl; int _tmain(int argc, _TCHAR* argv[]) { int *a=new int[10]; for(int i=0;i<10;i++) a[i]=rand(); cout<<"排序前:"; for(int i=0;i<10;i++) cout<<a[i]<< " "; cout<<endl; randomizedQuickSort(a,0,9); cout<<"排序后:"; for(int i=0;i<10;i++) cout<<a[i]<< " "; cout<<endl; system("PAUSE"); return 0; }
必须注意的是,此算法排序的数组中不能出现重复的元素。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端