快排是在每轮挑选一个基准元素,并让其比他大的元素移动到数列一边,比他小的元素移动到数列的另一边,从而把数列拆解成两个部分,即分治思想。然后运用递归。
一、快排双边边循环递归
#include <stdio.h>
#include <stdlib.h>
void Qsort(int arr[],int low,int high)
{
if(low > high)
return ;
int left = low;
int right = high;
int key = arr[low];
while(left < right )
{
//控制右边指针左移
while(arr[right] > key )
{
if(right==left)
break;
right--;
}
//控制左边指针右移
while(arr[left] <= key )
{
if(left==right)
break;
left++;
}
//交换left和right对应的值
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
//将基数值和right对应的值(指针重合点)交换
int temp = arr[low];
arr[low] = arr[right];
arr[right] = temp;
int i;
for(i = 0; i < 9; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
Qsort(arr,low,right-1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
Qsort(arr,right+1,high);
}
int main()
{
int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
//Qsort(a,0,sizeof(a)/sizeof(a[0])-1);
Qsort(a,0,8);
int i;
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("\n");
}
二、快排单边循坏递归
#include <stdio.h>
#include <stdlib.h>
void Qsort(int arr[],int low,int high)
{
if(low > high)
return ;
int key = arr[low];//基数
int mark = low;//指针代表小于基准元素的区域边界
int i,temp;
for(i = mark+1;i<high+1;i++)
{
if(arr[i] < key)
{
//mark右移,并且交换mark指向的值和最新遍历到的值进行交换
mark++;
temp = arr[i];
arr[i] = arr[mark];
arr[mark] = temp;
}
}
//将基数值和mark对应的值(指针重合点)交换
arr[low] = arr[mark];
arr[mark] = key;
for(i = 0; i < 9; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
Qsort(arr,low,mark-1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
Qsort(arr,mark+1,high);
}
int main()
{
int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
//Qsort(a,0,sizeof(a)/sizeof(a[0])-1);
Qsort(a,0,8);
int i;
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("\n");
}