sorting(按从小到大排序)
一、快速排序(交换排序)
不稳定排序
步骤:
1、选择主元数据 x , 把序列分为两个子序列(<=x 和 >x)
2、按第一步递归处理两个子序列
c++代码:
//处理sequence[p~q]子序列 void QuickSort(vector<int>& sequence, int p, int q) { int x = sequence[p]; //主元 int i = p, temp; //前i个元素小于等于主元x for(int j=p+1; j<=q; ++j) { if(sequence[j]<=x) { ++i; //第j个元素小于等于x,则小于等于x的个数i要加1 //现在的第i个元素是原本的第i+1个元素,放的是大于x的元素,因此将其与第j个元素交换 temp = sequence[i]; sequence[i] = sequence[j]; sequence[j] = temp; // 交换后前i个元素小于等于主元x } } // 将sequence[p]即x与sequence[i]交换 // 则sequence[p~i-1]小于等于x,sequence[i]=x,sequence[i+1~q]大于x sequence[p] = sequence[i]; sequence[i] = x; //处理小于等于主元的子序列 if(i-p <= 1) return; else QuickSort(sequence, p, i-1); //处理大于主元的子序列 if(q-i <= 1) return; else QuickSort(sequence, i+1, q); }
空间复杂度:除了序列本身外,只有temp
S(n) = θ(1)
时间复杂度:
最好情况:若每次递归,主元排序后恰好在序列中间,分成两个长度为n/2的子序列
则T(n) = θ(nlgn)
最坏情况:每次递归,主元将序列分为长度为n-1和1的两个子序列
T(n) = θ(n^2)
优化:随机化快速排序,每次随机选主元,而不是选第一个,
T(n) = θ(nlgn)