目的:【实现从小到大排序】
i=low,j=high,p=r[low];
算法步骤:
1、取数字的第一个元素作为基准元素【p】,可以去第一个p=R[i];
2、从右往左扫描,找到小于或等于p的数,如果找到,就让R[i]和R[j]交换位置;同时,i++;
3、从左往右扫描,找到大于或等于p的数,如果找到,R[i]和R[j]交换,j++;
4、重复2,3步骤,直到i与j重合,返回该位置,mid=i,该位置的数正好是p元素。
5、至此完成一趟排序,此时以mid为界,将原序列分成两个子序列,左边小于p,右边大于p,在分别对这两个子序列进行快速排序。
代码实现
想哭。。。
#include<stdio.h>
void swap(int *x, int *y) {
int t;
t=*x ;
*x = *y;
*y = t;
}
int fun(int a[], int low, int high){
int p = a[low],i=low,j=high;
while(i<j){
while (i<j&&a[j] >=p)j--;//从右往左,找到第一个<p的元素,跟p交换
if (i < j)swap(&a[i++], &a[j]);
while (i<j&&a[i] <=p)i++;//从左往右,找到比p大或者等的 ,跟p交换
if (i < j)swap(&a[i++], &a[j--]);
return i;
}
return i;
}
void happy(int a[], int low, int high) {
int mid;
if(low<high){
mid = fun(a, low, high);
happy(a, low, mid-1);
happy(a, mid+1, high);
}
//第一次,排序low,high,递归排序low,mid-1
//————【排序low,mid-1【排序low,mid'-1[]......直到low=high(排到两个相邻的数了)】
//,,递归排序mid+1,high【【【】】】
}
int main() {
int high = 10;
int b[] = { 13,56,32,22,1,5,66,11,2,9,66 };
for(int i=0;i<9;i++)//循环9次
happy(b, 0, 9);
for (int i = 0; i < high; i++) {
printf("%d\n", b[i]);
}
return 0;
}