模拟快速排序(C++版)
纯新人有啥错误的还望大佬指出
原理优化 (分治)
将原来的N方优化为N*log(N)
将逐一对比优化为分步
/////////////以从大到小举例
先确定分界点,将分界点的值命名为X
(因为必须要在左右端点以内,所以一般取两端点之和除以2)
然后以X为中心进行交换
(将左边第一个比A大的数值的坐标记录,将右边第一个比A小的记录,交换两者的值)
直到X的左边都比X大,X的右边都比X小,停止,向两边重复进行操作(这时以分界点为中心分为两部分,向左的部分右端点为j,向右部分左端点为j+1///可改变)(log(n)次)
最后便是答案
C++版本
#include <iostream> using namespace std; int n; int q[10010];//数据范围待定 void sort_(int q[],int l,int r)//q为数组,l、i为左右端点 { if(l>=r) return; int i=l-1,j=r+1,x=q[(l+r)>>1];//(l+r)>>1是l+r除以2的意思 while(i<j) { i++,j--;//与上文中i=l-1,j=r+1相接应,防止因为相同出现死循环 while(q[i]<x) i++;//(求x左边第一个大于x的值) while(q[j]>x) j--;//(求x右边第一个小于x的值) if(i<j) swap(q[i],q[j]);//交换i,j,下标的值 } sort_(q,l,j),sort_(q,j+1,r); } int main() { cin>>n; for(int i=0;i<n;i++) scanf("%d",&q[i]); sort_(q,0,n-1); for(int i=0;i<n;i++) cout<<q[i]<<' '; return 0; }

浙公网安备 33010602011771号