/*
*快速排序的递归形式
*/
#include<stdio.h>
#include<stdlib.h>
/*
* 划分算法
* 输入:数组arr[low,high]
* 输出:主元位置
* Parm:
* i:指向标杆的指针
* j:指向要与标杆比较元素的指针
* x:标杆元素
*
*
* 思想:
* 1.将数组arr元素arr[low]作为标杆
* 2.开始:i指向arr[low],j开始指向第arr[low+1]
* 3.比较 j元素和标杆元素的大小
* 当 x < *j,即j指向的元素大于标杆元素,j++继续执行循环
* 当 x >= *j,即j指向的元素小于标杆元素,i++(i向后移动一位),
* 判断i、j是否指向同一个元素
* 如果i != j,即i、j不指向同一个元素 ,则互换i、j所指向元素
* 4.执行完比较后,i指向元素前的除标杆元素(arr[low])包括i指向的元素的所有元素的值,都小于标杆元素;
* i指向元素后的所有元素的值都大于标杆元素
* 5.交换标杆元素和i指向元素,即得到:i 指向元素前的所有元素都小于该元素,i指向元素后的所有元素都大于该元素
*
*/
int split(int *arr, int low, int high){
int *i, *j;
int x;
int temp;
i = arr + low;
x = *i;
for (j = i + 1; j <= arr + high; j++){
if (x >= *j){
i++;
if (i != j){
temp = *i;
*i = *j;
*j = temp;
}
}
}
temp = *(arr + low);
*(arr + low) = *i;
*i = temp;
return i - arr;
}
/*
* 快速排序迭代实现
* 输入:arr[start,end]
* 数组:arr数组所有元素排好顺序
* parm:
* arr[start,end]
* 步骤:
* 1.通过划分算法得到该数组标杆元素(即第一个元素)的正确位置
* 2.通过递归实现标杆元素左边所有元素排序
* 3.通过递归实现标杆元素右边所有元素排序
*/
void quickSort(int *arr, int start, int end){
if(start < end){
int m;
m = split(arr, start, end);
quickSort(arr,start,m - 1);
quickSort(arr,m + 1,end);
}
}
int main(void){
int arr[8] = { 5, 3, 8, 99, 11, 0, 2, 3 };
int i;
quickSort(arr, 0, 7);
for (i = 0; i < 8; i++){
printf("%d ", arr[i]);
}
system("pause");
return 0;
}