数据结构之——快速排序

来源:互联网 发布:风靡一时的网络歌曲 编辑:程序博客网 时间:2024/06/07 22:01
#include <stdio.h>#include <stdlib.h>#define true 1#define false 0typedef int bool;//输入一个数组,进行快速排序后输出//快排子函数,输入参数为数组名和数组最小的下标和最大的下标//快速排序的实现依赖于递归,该首先确定了某个元素在序列中的位置后,将原序列分为左右两个部分,然后按照先左,再右的顺序进行递归void quick_sort(int * a, int low ,int high){    int pos = low;    if(low < high)    {        pos = locate(a,low,high);        quick_sort(a,low,pos-1);        quick_sort(a,pos+1,high);    }}//将 low 位置上的元素在数组中确定其定位,并返回位置序号 pos ;快排程序理解的难点一是递归,二是这个子函数int locate(int* a,int low ,int high){    int val = a[low];   //定位此次递归中,最左侧元素 a[low] 的位置,并返回位置序号 pos    while(low < high)    {        while(low < high && a[high] > val)   //最右侧元素比 val 的值大时,high-- ,直到 a[high]不再大于 val 也就是说,此时的a[high]必须要换到a[low]了               high--;                         //再出现在这儿不合适了        a[low] = a[high];        while(low < high && a[low] < val)     //最左侧的元素比 val 的值小时, low++ ,直到 a[low]不再小于 val ,也就是说,此时的a[low]应该出现在val 的右侧            low++;        a[high] = a[low];           }    a[low] = val;        //当以上 while 循环结束后,必然有 low == high 此时的位置,即为 val 这个元素应该在的位置,并返回此位置     return low;          //此位置返回后,又会将原序列分为左右两部分,然后按照先左边,再右边的顺序递归,并且每次递归了,都是确定其每个子序列最左侧元素的位置}int main(){    int num,i;    char c;    printf("请输入数组元素的个数 = \n");    scanf("%d",&num);    int a[num];    printf("请输入数组元素,每个元素以逗号隔开\n");    for(i=0;i<num;i++)    {        if(scanf("%c",&c)==',')            break;        scanf("%d",&a[i]);    }    quick_sort(a,0,num-1);    for(i=0;i<num;i++)    {        printf("%d ",a[i]);    }    return 0;}

0 0
原创粉丝点击