c语言-快速排序
https://zhuanlan.zhihu.com/p/350934702
快速排序是对冒泡排序的一种改进,采用了一种分治的策略。
思路:将当前的基准数放到其应该在的位置
步骤:
入参(arr,low,high)
- 决定基准数arr[low],left=low,right=high
- 从右向左找第一个小于基准数的数字,标记下标 left
- 从左向右找第一个大于基准数的数字,标记下标 right
- 如果left和right没有重合,就交换这两个数
- 如果left和right重合了,说明当前这个下标就是我们的基准数应该在的位置,交换基准数和这个下标的数
- 递归对左右两个数组调用快排函数
/*****************************************************
File name:Quicksort
Author:Zhengqijun Version:1.0 Date: 2016/11/04
Description: 对数组进行快速排序
Funcion List: 实现快速排序算法
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
#define BUF_SIZE 10
/**************************************************
*函数名:display
*作用:打印数组元素
*参数:array - 打印的数组,maxlen - 数组元素个数
*返回值:无
**************************************************/
void display(int array[], int maxlen)
{
int i;
for(i = 0; i < maxlen; i++)
{
printf("%-3d", array[i]);
}
printf("\n");
return ;
}
/************************************
*函数名:QuickSort
*作用:快速排序算法
*参数:
*返回值:无
************************************/
void QuickSort(int *arr, int low, int high)
{
if (low < high)
{
int left = low;
int right = high;
int base = arr[low];
while(left<right){
while(left < right && arr[right]>=base){
right--;
}
while(left < right && arr[left]<=base){
left++;
}
if(left<right){
int temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
}
}
//当跳出上面的while循环的时候说明left与right重合了
//将基准数与left调换
int temp=arr[low];
arr[low]=arr[left];
arr[left]=temp;
// 递归调用
QuickSort(arr, low, left - 1); // 排序k左边
QuickSort(arr, left + 1, high); // 排序k右边
}
}
// 主函数
int main()
{
int array[BUF_SIZE] = {12,85,25,16,34,23,49,95,10,61};
int maxlen = BUF_SIZE;
// printf("before\n");
// display(array, maxlen);
QuickSort(array, 0, maxlen-1); // 快速排序
// printf("after\n");
display(array, maxlen);
return 0;
}