快速排序

来源:互联网 发布:朋友圈发广告软件 编辑:程序博客网 时间:2024/06/05 20:04

快速排序

原理

    和之前学习到的归并排序一样,快速排序也使用了分治的思想。假设现有一个数组a[start,end],对这个数组进行快速排序分了下面三个步骤:

  1. 分解:在数组a[start,end]中确定一个标准(一般是找a[end]),以这个标准调整元素并找出一个位置p,使得start<=i<=p-1区域内的所有元素都小于等于a[end],而p+1<=i<=end这个区域中所有元素都大于等于a[end]。下面是图解:
    这里写图片描述
  2. 解决:通过递归调用快速排序,对分出来的子数组a[start,p-1]和a[p+1,end]进行排序。
  3. 合并:因为子数组都是原址排序的,因此不需要合并的操作。

C语言实现

int partition(int* a, int start, int end){    int x = a[end];    int i = start;    //调整整个数组中元素的位置并找出中间值的索引    for (int j = start; j < end; j++)    {        if (a[j] <= x)        {            int t = a[i];            a[i] = a[j];            a[j] = t;            i++;        }    }    //将中间值放在找出的中间值索引处    int t = a[i];    a[i] = a[end];    a[end] = t;    return i;}void quick_sort(int* a, int from, int to){    if (from < to)    {        int p = partition(a, from, to);        quick_sort(a, from, p - 1);        quick_sort(a, p + 1, to);    }}void main(){    int count, *p;    printf("请输入需要排序的数的个数 :");    scanf_s("%d", &count);    p = (int*)malloc(count * 2);    printf("\n请输入需要排序的%d个数字:",count);    for (int i = 0; i < count; i++)    {        scanf_s("%d", p+i);    }    printf("\n快速排序后的数组:");    quick_sort(p, 0, count - 1);    for (int i = 0; i < count; i++)    {        printf("%d ", p[i]);    }    printf("\n");    system("pause");}

算法分析

    

0 0
原创粉丝点击