当前位置:软件学习 > 其它软件 >>

排序算法之快速排序

快速排序基本思想:挖坑填数+分治法

 

快速排序的分治partition过程有两种方法,一种是上面所述的两个指针索引一前一后逐步向后扫描的方法(算法导论上采用的是这种方法),还有一种方法是两个指针从首位向中间扫描的方法(大多数的人和一般的教材采用的是这第二种首尾向中间扫描法)。本文采用第二种方法。

 

1,把第一个作为基准,

 

2,先从后向前找,找到小于的,放在第一个

 

3,再从前向后找,找到大于的,放在刚刚移过的坑中,然后重复

 

 

 

<pre name="code" class="cpp">#include<stdio.h> 

#include<time.h> 

#define Length 500 

 

//函数声明 

void QuickSort(long*,long,long); 

long  Partition(long*,long,long); 

void Swap(long*,long*); 

 

int main() 

    long L[Length]; 

    long i=0; 

    printf("请分别输入%d个整数:\n",Length); 

    for(i=0;i<Length;i++) 

    { 

        printf("\n请输入第%d个整数:",i+1); 

            scanf("%d",&L[i]); 

    } 

    printf("\n排序前:"); 

    for(i=0;i<Length;i++) 

    { 

        printf("%5d",L[i]); 

    } 

     

    QuickSort(L,0,Length-1); 

     

    printf("\n排序后:"); 

    for(i=0;i<Length;i++) 

    { 

        printf("%5d",L[i]); 

    } 

    printf("\n"); 

    getchar(); 

    getchar(); 

    getchar(); 

    return 0; 

//算法实现 

//快速排序算法是一种递归实现的算法,所以必然要使用额外在堆栈做为辅助空间,堆栈深度与N个结点的 

 

二叉树相同,约为O(logn) 

//快速排序算法的时间复杂度为O(nlogn),在平均性能方面目前公认为最好的算法 

void QuickSort(long*L,long low,long high) 

    long pivotloc; 

    if(low<high) 

    { 

        pivotloc=Partition(L,low,high); 

        QuickSort(L,low,pivotloc-1); 

        QuickSort(L,pivotloc+1,high); 

    } 

 

long Partition(long*L,long low,long high) 

    long pivotkey=L[low];  //把第低位做为枢轴位置 

     

    while(low<high) 

    { 

        //当枢轴右边元素都比枢轴大时,高位左移,直接所 

        while(low<high&&L[high]>=pivotkey) high--; 

        Swap(&L[low],&L[high]); 

        while(low<high&&L[low]<=pivotkey)  low++; 

        Swap(&L[low],&L[high]); 

    } 

    return low; 

 

//用于交换数据的函数 

void Swap(long* a,long* b) 

    long temp; 

    temp=*a; 

    *a=*b; 

    *b=temp; 

}   

 

creat by 张飞雪

 

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,