快速排序
2012-04-27 21:54 youxin 阅读(249) 评论(0) 编辑 收藏 举报先看普通版本
#include<stdio.h> int Partition(int A[],int p,int r) { //最后一个r做pivot int tmp; int i=p-1; int j=p; for(j=p;j<=r-1;j++) if(A[j]<=A[r])
{ i++; tmp=A[i];A[i]=A[j];A[j]=tmp; } tmp=A[i+1],A[i+1]=A[r],A[r]=tmp; return i+1; } void QuickSort(int A[],int p,int r) { int q; if(p<r) { q=Partition(A,p,r); QuickSort(A,p,q-1); QuickSort(A,q+1,r); } } int main() { int i,n; int arr[20]; printf("请输入数组的大小"); scanf("%d",&n); printf("请输入数组元素\n"); for(i=0;i<n;i++) scanf("%d",arr+i); QuickSort(arr,0,n-1); printf("快速排序结果为\n"); for(i=0;i<n;i++) printf("%d\t",arr[i]); }
随机化是从a[p...r]中随机选出的一个元素交换。
随机化代码是quicksort划分时q=randomized_partition;
randomized_partition(int a[],int p,int r) {
srand(time(NULL)); //产生不同的种子 int i=rand()%(r-p+1)+p; // [p,r]; { int tmp=a[r];a[r]=a[i];a[i]=tmp; } return partition(a,p,r); }
rand()在stdlib.h头文件中。time在头文件time.h中.
快速排序partition还有一个版本比较流行。
int partition2(int a[],int p,int r) { int i,j; //a[p] pivot i=p+1; j=r;
//这里不能写成while(l<r),否则不会正确排序,比如 5,3,-1,4,7 while(1) { while(a[i]<a[p]) i++; while(a[j]>a[p]) j--; if(i>=j) break; int tmp=a[i],a[i]=a[j],a[j]=tmp; } int tmp=a[j],a[j]=a[p],a[p]=tmp; //不能写成swap(a[i],a[p]),只能是j. return j; }
为什么不能写成
wap(a[i],a[p]),只能是j.可以用2,1,3举例。
最后i变成了2,j变成1。只能是j是因为a[j]一定是小于pivot的。
更简单代码:
int Partition(int a[],int p,int r) { int i=p,j=r+1; int x=a[p]; while(1) { while(a[++i]<x && i<r); while(a[--j]>x); if(i>=j) break; int temp; //交换两个数的值 temp=a[j]; a[j]=a[i]; a[i]=temp; } a[p]=a[j]; a[j]=x; return j; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通