今天来复习下几个常用的排序方式,首先想到的就是快速排序,思路用的是分治思想。
选取一个标准值,利用两个指针i,j分别只想最左边,最右边,i从左边找到1个比这个标准值大的数,j从右边找到1个比这个值小的数,两者交换,直到i>j
就找到了这个标准值的位置。
/* 快速排序,分治思想 给定的N个数从小到达进行排序 3 2 4 5 1 思路:选定第一个元素作为轴,i从左往右找比他大的一个数a[i],j从后往前找比他小的数a[j] 两者交换,知道i>j 对轴左边继续执行上述操作,右边继续执行上述操作,分而治之 */ #include <bits/stdc++.h> using namespace std; int a[1000010]; int n; void mysort(int a[],int l,int r){ //i记录轴左边位置,j记录轴右边位置 int i=l,j=r; int pvot=a[(l+r)>>1]; while(i<=j){ //从左边找比他大的一个数 while(a[i]<pvot){ i++ ; } //从右边找比他小的一个数 while(a[j]>pvot){ j--; } if(i<=j){ swap(a[i],a[j]);//交换 i++; j--; } } //左右两边分别排序 if(l<j) mysort(a,l,j); if(i<r) mysort(a,i,r); } int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } int l=0,r=n-1; mysort(a,l,r); for(int i=0;i<n;i++){ printf("%d ",a[i]); } return 0; }
有话要说...