快速排序
快速排序是一种比较重要的排序方法,快速排序在同为O(N*logN)的几种排序方法中效率高,因此经常被采用,特别是随机快排在工程实际中用到的非常多。快速排序的思想和荷兰国旗的一样,我们这里再次回顾一次。
快速排序:将一个数组进行排序,选择最后一个数作为基准,小于这个数的所有元素放左边,等于这个数的所有元素放中间,大于这个数的所有元素放右边。不断递归,得到最后的顺序。
看一下代码吧:
# include <stdio.h>
int p[2]={0,0}; //存储左边界和右边界
void swap(int arr[], int i, int j) //数组arr中第i个元素与第j个元素进行交换
{
int swap_temp = arr[i];
arr[i] = arr[j];
arr[j] = swap_temp;
}
void partition(int arr[], int left, int right)
{
int less = left - 1;
int more = right ;
while( left < more) //结束条件是left与more相等
{
if(arr[left] < arr[right]) //当前元素小于最右边元素值,与小于区域交换
{
swap(arr, ++less, left++);
}
else if(arr[left] > arr[right]) //当前元素大于最右边元素值,与大于区域交换并再次比较
{
swap(arr, --more, left);
}
else //等于最右边元素值不用动
{
left++;
}
}
p[0] = less + 1; //全局变量形式得到左边界
p[1] = more; //全局变量形式得到右边界
}
void quickSort(int arr[], int left, int right)
{
if(left <= right) //迭代结束条件,左边和右边相等
{
partition(arr, left, right); //得到左边界和右边界
quickSort(arr, left, p[0] - 1); //递归排左边
quickSort(arr, p[1]+1, right); //递归排右边
}
}
int main(void)
{
int a[] = {500, 22, 53, -158, 4, 86, 32, 33, 26, -70, 135, -34, 32, 543, 2500};
int n,i; //存放数组a中元素的个数
n = sizeof(a) / sizeof(a[0]); /*a[0]是int型, 占4字节*/
quickSort(a,0,n-1); //经典快速排序
for(i =0; i< n; i++)
{
printf("%d\t",a[i]); //输出排完序的数组
}
printf("\r\n");
return 0;
}