2 条题解
-
0
Guest
-
1
介绍一种二分快排的方法``
void quicksort(int a[],int l,int r) { if(l>=r) return;//递归边界,检测左右两端点是否已排完 int i=l-1,j=r+1,flag=a[l+r>>1];//设定哨兵flag,其中l+r>>1=(l+r)/2 while(i<j) { do i++;while(a[i]<flag);//从左到右查找比哨兵大的数 do j--;while(a[j]>flag);//从右到左查找比哨兵小的数 if(i<j) swap(a[i],a[j]);//找到数之后交换他们的位置 } quicksort(a,l,j);//递归排序左边部分 quicksort(a,j+1,r);//递归右边 }
调用方法
int n,a[11451]={0}; int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } quicksort(a,0,n-1); for(int j=0;j<n;j++) { printf("%d ",a[j]); } }
-
0
诏曰
#include<bits/stdc++.h> using namespace std;//4 5 6 1 5 2 3 5 int nums[100000000],n,m; int part(int* p,int l,int r){ while(l<r){ while(l<r&&p[l]<p[r]) r--; if(l<r) swap(p[l++],p[r]);//换位后左指针向右移一位 while(l<r&&p[l]<p[r]) l++; if(l<r) swap(p[l],p[r--]);//换位后右指针向左移一位 } return r; } void QuickSort(int* p,int l,int r){ int mid; if(l<r){ mid=part(p,l,r); QuickSort(p,l,mid-1); QuickSort(p,mid+1,r); } } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>nums[i]; QuickSort(nums,1,n); for(int i=1;i<=n;i++) cout<<nums[i]<<" "; return 0; }
- 1
信息
- ID
- 666
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 39
- 已通过
- 11
- 上传者