快排
方法一:
思想:对序列A[1]、A[2]…A[n],进行调整,使得A[1]的左边不大于A[1],右边都大于A[1],其中用于划分区间的元素A[left]是主元。
步骤:
- 将A[left]放到temp临时变量中;
- 从右边开始,是否大于temp,如果大于,就继续向左移动;否则,将此时的A[right]赋值给A[left];
- 再看左边,是否小于temp,如果小于,就继续向右移动;否则,将此时的A[left]赋值给A[right];
- 直到left与right相遇,此时将temp赋值给A[left];
代码:分两个步骤
- 对区间[left,right]进行划分,找到中间位置pos;
- 进行快速排序的递归操作。
//1.对区间 [left,right] 进行划分
int Partition(int A[], int left, int right){
int temp = A[left];
while(left < right){
while(left < right && A[right] > temp) right--;
A[left] = A[right];
while(left < right && A[left] <= temp) left++;
A[right] = A[left];
}
A[left] = temp;
return left;
}
// 快速排序
void quickSort(int A[], int left, int right){
if(left < right){
int pos = Partition(A, left, right);
quickSort(A, left, pos-1);
quickSort(A, pos+1, right);
}
}
示例一:对输入的数字进行快速排序
#include<iostream>
using namespace std;
//对区间 [left,right] 进行划分
int Partition(int A[], int left, int right){
int temp = A[left];
while(left < right){
while(left < right && A[right] > temp) right--;
A[left] = A[right];
while(left < right && A[left] <= temp) left++;
A[right] = A[left];
}
A[left] = temp;
return left;
}
// 快速排序
void quickSort(int A[], int left, int right){
if(left < right){
int pos = Partition(A, left, right);
quickSort(A, left, pos-1);
quickSort(A, pos+1, right);
}
}
int main(){
int arr[10];
for(int i = 0; i < 10; i++){
scanf("%d",&arr[i]);
}
quickSort(arr, 0, 9);
for(int i = 0; i < 10; i++){
printf("%d ",arr[i]);
}
return 0;
}
注意:
quickSort(arr, 0, 9)
,其中0和9分别是数组的下标,A[0],A[9].
方法二:速度更快,并且不会循环
思想:
有两个指针 i 、j,其中 i 指向左端点,j 指向右端点,同时向中间走。如果 i 指向的数小于分界点,则向右移动一位,直到遇到一个大于等于分界点的值停下(该值应该放在分界点右边)接下来移动 j 。如果 j 指向的数大于分界点,则向左移动一位,直到遇到一个小于等于分界点的值停下(该值应该放在分界点左边)。此时 i 指向的数应该放到右边,j 指向的数应该放到左边,交换 i 、j 的指向的值,交换之后 i 指向的数小于等于分界点、j 指向的数大于等于分界点,i 向右移动一位,j 向左移动一位。i 、 j 继续向中间移动,直到相遇或交叉为止,相遇之后就把整个区间一份为二了(不包括 j 指向的值右边为大于等于分界点的部分,不包括 i 指向的值左边为小于等于分界点的部分)
代码:
void quick_sort(int q[], int l, int r){
if(l >= r) return q[l];
int i = l-1, j = r + 1, x = q[l + 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,k);
quick_sort(q, j+1, r,k);
}