快速排序
- 思路
选定一个pivot, 移动元素使得pivot左右两边的元素,一边大于pivot, 一边小于pivot, 然后
分别对左右两边递归进行同样的操作,最后得到一个有序排列。
- 复杂度
快速排序的最坏时间复杂度为: O(n) = n^2,但平均复杂度为: O(n) = nlogn
cpp实现
template <class Type>
void Swap(Type *a, Type *b) {
Type tmp = *a;
*a = *b;
*b = tmp;
}
template <class Type>
int Partition(Type arr[], int p , int r) {
int i = p, j = r;
Type x = arr[p];
while(true) {
while(arr[j]> x && i < j) {
j--;
}
while(arr[i]<= x && i < j ) {
i++;
}
if (i == j) break;
Swap(&arr[i],&arr[j]);
}
Swap(&arr[p], &arr[j]);
return j;
}
template<class Type>
void QuickSort(Type arr[], int p, int r) {
if (p < r) {
int q = Partition(arr,p,r);
QuickSort(arr,p,q-1);
QuickSort(arr,q+1,r);
}
}
void quicksort(int a[],int left, int right)
{
int i,j,t,temp;
if (left > right)
return;
temp = a[left];
i = left;
j = right;
while(i != j)
{
while(a[j] >= temp && i < j) {
j--;
}
while(a[i] <= temp && i < j) {
i++;
}
if (i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
quicksort(a,left,i-1);
quicksort(a,i+1,right);
}
template <class Type>
int Partition(Type arr[], int p , int r) {
int pivot = arr[p];
int highvac = r;
int lowvac = p;
bool direct = true; //true for right, false for left
while(highvac > lowvac) {
if (direct == true) {
if(arr[highvac] <= pivot) {
arr[lowvac] = arr[highvac];
lowvac++;
direct = false;
} else {
highvac--;
}
} else {
if(arr[lowvac]> pivot ) {
arr[highvac] = arr[lowvac];
highvac--;
direct = true;
}else {
lowvac++;
}
}
}
arr[highvac] = pivot;
return highvac;
}
template<class Type>
void QuickSort(Type arr[], int p, int r) {
if (p < r) {
int q = Partition(arr,p,r);
QuickSort(arr,p,q-1);
QuickSort(arr,q+1,r);
}
}