#include<iostream>#include<algorithm>usingnamespace std;constint N =100010;int n;int a[N];voidquick_sort(int a[],int l,int r){if(l == r)return;int i = l -1, j = r +1;int x = a[l + r >>1];//若int x = a[r + l + 1 >> 1],//则quick_sort(a, l, i - 1); quick_sort(a, i, r);while(i < j){do i ++;while(a[i]< x);//这里不可以写成a[mid],因为可能a[mid]的值已经改变了do j --;while(a[j]> x);if(i < j)swap(a[i], a[j]);}quick_sort(a, l, j);//这里的边界值该怎么取?算了,不知道,就这样取吧,死记硬背quick_sort(a, j +1, r);}intmain(){
cin >> n;for(int i =1; i <= n; i ++)
cin >> a[i];quick_sort(a,1, n);for(int i =1; i <= n; i ++)
cout << a[i]<<" ";return0;}
#include<iostream>#include<algorithm>usingnamespace std;constint N =100010;int n;int A[N];voidmerge_sort(int A[],int l,int r ){if( l >= r )return;//说明只剩下一个元素了,没有必要归并排序了,其实这里改为l == r也可,因为不会出现l > r的情况int mid =( l + r )>>1;merge_sort( A, l, mid );merge_sort( A, mid +1, r );//从这里开始对两个有序序列进行归并排序int tmp[N];//tmp是存储从l到r归并排序后的数列int k =1, a = l, b = mid +1;while( a <= mid && b <= r )//同小取小,必为两段数中最小的那个{if( A[a]<= A[b])
tmp[k ++]= A[a ++];else
tmp[k ++]= A[b ++];}while( a <= mid )//可能会有剩余的数据,把它们添在排好序的数据后面
tmp[k ++]= A[a ++];while( b <= r )
tmp[k ++]= A[b ++];for(int i = l, j =1; i <= r; i ++, j ++)//这里出了错误,这里的i是从l到r的,不是从1到k - 1的。而且tmp从1遍历到k - 1,上面没写是因为r - l = (k - 1) - 1。
A[i]= tmp[j];}intmain(){
cin >> n;for(int i =1; i <= n; i ++)
cin >> A[i];int l =1, r = n;merge_sort( A, l, r );for(int i =1; i <= n; i ++)printf("%d ", A[i]);return0;}
排序算法快速排序#include <iostream>#include <algorithm>using namespace std;const int N = 100010;int n;int a[N];void quick_sort(int a[], int l, int r){ if(l == r) return; int i = l - 1, j = r + 1; int x = a[l + r &g