学习:快速排序(简单版)
此版本不适用于有大量重复值和数据基本有序的数据进行快速排序。
#include <stdio.h>
//交换
void swap(int *a, int *b)
{
int t=*a;
*a=*b;
*b=t;
}
//划分数组:a[l...j-1]<pivot, a[j]==pivot, a[j+1...r]>=v
int partition(int a[], int l, int r)
{
int i,j=l,pivot=a[l];
for(i=l+1; i<=r; i++)
if(a[i] < pivot)
swap(&a[++j],&a[i]);
swap(&a[l],&a[j]);
return j;
}
//递归处理数组的左边和右边
void __quickSort(int a[], int l, int r)
{
int p;
if(l >= r)
return;
p=partition(a,l,r);
__quickSort(a,l,p-1);
__quickSort(a,p+1,r);
}
void quickSort(int a[], int n)
{
__quickSort(a,0,n-1);
}
int main()
{
int i,a[10]={9,8,7,6,5,4,3,2,1,0};
quickSort(a,10);
for(i=0; i<10; i++)
printf("%d ",a[i]);
return 0;
}
将重复的值放在两端
#include <stdio.h>
void swap(int *a, int *b)
{
int t=*a;
*a=*b;
*b=t;
}
int partition(int a[], int l, int r)
{
int i=l+1,j=r,pivot=a[l];
while(1)
{
while(i<=r && a[i]<pivot) i++;
while(j>=l+1 && a[j]>pivot) j--;
if(i > j)
break;
swap(&a[i],&a[j]);//a[i]>=pivot && a[j]<=pivot
i++;
j--;
}
swap(&a[l],&a[j]);
return j;
}
void __quickSort(int a[], int l, int r)
{
int p;
if(l >= r)
return;
p=partition(a,l,r);
__quickSort(a,l,p-1);
__quickSort(a,p+1,r);
}
void quickSort(int a[], int n)
{
__quickSort(a,0,n-1);
}
int main()
{
int i,a[10]={9,8,7,6,5,4,3,2,1,0};
quickSort(a,10);
for(i=0; i<10; i++)
printf("%d ",a[i]);
return 0;
}