排序(快速排序,归并排序)
1.快速排序
思想:分治算法
三步骤:1.找一个分界值x;
2.将小于等于x的放在左边,将大于等于x的放在右边;
3。递归左右两边;
#include<iostream> using namespace std; const int N=1e5+10; void quick_sort(int q[],int l,int r) { if(l>=r){ return; } int x=q[(l+r)/2],i=l-1,j=r+1; while(i<j){ do i++;while(q[i]<x); do j--;while (q[j]>x); if(i<j) swap(q[i],q[j]); } quick_sort(q,l,j); quick_sort(q,j+1,r); } int main(){ int n; cin>>n; int q[N]; for(int i=0;i<n;i++) cin>>q[i]; quick_sort(q,0,n-1); for(int i=0;i<n;i++) printf("%d ",q[i]); return 0; }
2.归并排序
步骤:
1)先找到一个分界值x;
2)将数组一分为二,一个无序的数组成为两个数组;
3)合二为一,将两个有序数组合并成为一个有序数组;
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int tmp[N]; void merge_sort(int q[], int l, int r) { if (l >= r) return; int mid = l + r >> 1; merge_sort(q, l, mid), merge_sort(q, mid + 1, r); int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ]; else tmp[k ++ ] = q[j ++ ]; while (i <= mid) tmp[k ++ ] = q[i ++ ]; while (j <= r) tmp[k ++ ] = q[j ++ ]; for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j]; } int main() { int n; cin>>n; int q[N]; for(int i=0;i<n;i++) scanf("%d",&q[i]); merge_sort(q,0,n-1); for(int i=0;i<n;i++) printf("%d ",q[i]); return 0; }