快速排序——单向扫描分区法
思想
1、利用递归划分子问题
2、定主元,将小于主元的元素放在主元的左侧, 大于主元的元素放在主元的右侧
3、主元的左右两侧就是两个子问题,将每一个子问题重复第2步,即可使序列有序
实施方案
1、将主元定为每个序列或子序列的首元素
2、设置左指针与右指针,左指针指向主元的下一次元素,右指针指向最右边的元素
3、将左指针所指向的元素与主元比较,如果小于或等于主元,左指针向后移动,右指针不变;
如果大于主元,则将左指针所指向的元素,与右指针指向的元素交换,左指针不变,右指针向前移动一位
4、循环往复步骤3,直到左指针的位置大于右指针的位置
参考代码
#include<stdio.h>
void quickSort(int arr[], int p, int r);
int partition(int arr[], int p, int r);
void swap(int arr[], int sm, int bigger);
int main()
{
int array[] = {4, 1, 3, 5, 9, 2, 6, 8, 10};
int length = sizeof(array)/sizeof(array[0]);
quickSort(array, 0, length-1);
int i;
for( i=0; i<length; i++ ){
printf("%-2d", array[i]);
}
return 0;
}
void quickSort(int arr[], int p, int r){
if( p < r){
int q = partition(arr, p, r);
quickSort(arr, p, q-1);
quickSort(arr, q+1, r);
}
}
int partition(int arr[], int p, int r){
int pivot = arr[p];
int sp = p + 1;
int bigger = r;
while( sp <= bigger ){
if( arr[sp] <= pivot ){
sp++;
} else {
swap(arr, sp, bigger);
bigger--;
}
}
swap(arr, p, bigger);
return bigger;
}
void swap(int arr[], int sm, int bigger){
int temp = arr[sm];
arr[sm] = arr[bigger];
arr[bigger] = temp;
}