归并排序&&快速排序----分治思想
蒟蒻来水一篇博文方便复习参考
-
快速排序
快速排序的基本原理:随机选择一个基点,将比基点大的元素放在基点左侧,将比基点小的元素放在基点右侧。然后再分别只看基点左侧和右侧,重复上述过程。
由于其利用了分治思想,在平均状态下其时间复杂度为O(nlogn).
基本代码如下:
#include<bits/stdc++.h> using namespace std; void qsort(int a[],int s,int m);//排序函数 int main() { int N; cin>>N; int a[N]; for(int i=0;i<N;i++) { cin>>a[i]; } qsort(a,0,N-1); for(int i=0;i<N;i++) { cout<<a[i]<<" "; } } void qsort(int a[],int s,int m) { int i=s,j=m;//i从左侧开始扫描,j从右侧开始扫描 int pivot=a[s];//基点选取(在这里选择最左端的一项作为基点) if(s>=m) return; while(i!=j) { while(a[j]>pivot&&j>i) { j--; } swap(a[i],a[j]); while(a[i]<pivot&&i<j) { i++; } swap(a[i],a[j]); } qsort(a,s,i-1);//分别对初步排序后基点左侧和右侧分析 qsort(a,i+1,m); }
-
归并排序
归并排序的基本原理:将待排序数组一分为二,对于左右两侧,再次分别一分为二递归进行,最后进行合并,
其时间复杂度同快速排序同为O(nlogn)。其主要思想为分治思想。
代码如下:
#include<bits/stdc++.h> void msort(int a[],int s,int m,int b[]);//分函数 void merge(int a[],int s,int mid,int m,int b[]);//归并函数 using namespace std; int main() { int N; cin>>N; int a[N],b[N]; for(int i=0;i<N;i++) { cin>>a[i]; } msort(a,0,N-1,b); for(int i=0;i<N;i++) { cout<<b[i]<<" "; } return 0; } void msort(int a[],int s,int m,int b[]) { if(s>=m) return; int mid=s+(m-s)/2; msort(a,s,mid,b); msort(a,mid+1,m,b); merge(a,s,mid,m,b); } void merge(int a[],int s,int mid,int m,int b[]) { if(s>=m) return; int i=s,j=mid+1,t=0; while(i<=mid&&j<=m)//并操作,排序主要在此部分完成 { if(a[i]>a[j]) b[t++]=a[j++]; else b[t++]=a[i++]; } while(i<=mid) { b[t++]=a[i++]; } while(j<=m) { b[t++]=a[j++]; } for (int k = 0; k < m - s + 1; ++k) a[s + k] = b[k];//不能省略这一步(写了两次了都,都是省略了这一步出的错误),仔细品. }