快速排序与堆排序的实现

原创 2015年07月10日 15:50:25

快速排序

1.递归方法:

    void qsort(int a[],int l,int h){
        int t=a[l];
        int i=l;
        int j=h;
        while(i<j){
            while(i<j&&a[j]>=t){
                j--;
            }
           if(i<j)
               a[i]=a[j];
            while(i<j&&a[i]<=t){
                i++;
            }
            if(i<j)
                 a[j]=a[i];
        }
        a[j]=t;
        if(j-1>l){
            qsort(a,l,j-1);
        }
        if(j+1<h){
            qsort(a,j+1,h);
        }
    }


2.非递归方法:

int patision(int a[],int l,int h){
        int t=a[l];
        int i=l;
        int j=h;
        while(i<j){
            while(i<j&&a[j]>=t){
                j--;
            }
            a[i]=a[j];
            while(i<j&&a[i]<=t){
                i++;
            }
            a[j]=a[i];
        }
        a[j]=t;
        return j;
    }


void qsort(int a[],int size){
        int *stk=(int *)malloc(sizeof(int)*size);
        int h,l,m,q=0;
        int j;
        stk[q++]=0;
        stk[q++]=size-1;
        while(q!=0){
            h=stk[--q];
            l=stk[--q];
            if(l<h){
                m=patision(a,l,h);
                if(m-1>l){
                    stk[q++]=l;
                    stk[q++]=m-1;
                }
                if(m+1<h){
                    stk[q++]=m+1;
                    stk[q++]=h;  
                }
            }
            
        }
        free(stk);
    }


堆排序

堆排序思想:以大根堆为例,从编号最大的非叶子节点开始调整大根堆,然后依次减小编号,直到根节点,而调整堆的方法就是保证父节点总是比子节点大,否则父节点与较小的子节点交换,然后继续往下调整直到整棵子树满足大根堆的要求,最后堆的根节点就是最大的节点,与最后一个节点交换位置,然后除去最后一个节点外,其他的再次调整,一次类推,得到升序排列

代码实现如下:

void adjust_heap(int a[],int s,int m){
	int i,t;
        t=a[s];
        for(i=2*s+1;i<=m;i=2*i+1){
            if(i<m&&a[i]<a[i+1]){
                i++;
            }
            if(t>a[i]){
                break;
            }
            a[s]=a[i];
            s=i;
        }
        a[s]=t;
            
    }
	void hsort(int a[],int size){
        int i;
        int n=size;
        for(i=n/2-1,i>=0,i--){
            adjust_heap(a,i,n-1);
        }
        for(i=n-1;i>0;i--){
            a[0]=a[0]^a[i];
            a[i]=a[0]^a[i];
            a[0]=a[0]^a[i];
            adjust_heap(a,0,i-1);
        }
    }






快速排序与堆排序的C++实现

  • 2013年08月17日 06:55
  • 259KB
  • 下载

c++实现堆排序和快速排序比较

  • 2014年10月30日 11:26
  • 5KB
  • 下载

几种常见排序算法的实现(冒泡法,选择法,插入法,快速排序、堆排序)

#include "stdafx.h" //in the i th round ordering, j always points to the max element so far void bu...

Java 实现 堆排序 快速排序 以及 TopK问题(二)

接上文 已知快速排序可以将一个数组分成两部分,一部分大于某个值,一部分小于某个值,那么由这点可以推出取TopK值的方法如下: 假设快排每一趟的分割值的点为p,数组长度为n,那么需要...

冒泡、插入、归并、堆排序、快速排序的Java实现代码

import java.util.Arrays; public class Sort { static int swapTimes=0; public static void main(S...

快速排序堆排序性能对比

  • 2009年11月25日 08:18
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速排序与堆排序的实现
举报原因:
原因补充:

(最多只允许输入30个字)