快速排序法的总结

  快速排序法的总结

   今天终于从《征服c指针》这本书看到了早有耳闻的快速排序法,以前学过选择排序,交换排序,冒泡排序,今天又多了一种排序算法。书中作者讲到测试对5万个随机整数进行排序,冒泡排序花了117秒,而快速排序仅仅用了65毫秒。哎,果真算法正重要啊!
一开始看《征服c指针》的快速排序的交换法感觉没怎么看懂,于是上网找了篇好文“原文地址http://blog.csdn.net/morewindows/article/details/6684558”的白话经典算法系列,其中介绍的填坑式快速排序倒是很容易懂,代码如下
#include<stdio.h>
#include<stdlib.h>
void quicksort(int s[] ,int left,int right)//快速排序算法
{
    if(left<right)
    {
        int key=s[left];//关键值设为左边第一个数
        int i=left,j=right;
        while(i<j)
        {
                while(i<j&&s[j]>key)//从右开始寻找比key小的值
                {
                    j--;
                }
                if(i<j)
                {
                    s[i]=s[j];//将s[j]的值赋给s[i],此时s[j]为一个坑
                    i++;
                }
                while(i<j&&s[i]<key)//从左往右寻找比key大的值
                {
                    i++;
                }
                if(i<j)
                {
                    s[j]=s[i];//将s[i]的值赋给s[j],将s[j]之前玩的坑填上
                }
		}

        //如果i=j,这轮分堆分完,将key填给s[i]
        s[i]=key;
        //递归
        quicksort(s,left,i-1);
        quicksort(s,i+1,right);
    }
}

int main()
{
	int i;
    int s[]={1,4,5,6,3,2,9};
    quicksort(s,0,6);//数组长度记得减1
    for (i=0;i<sizeof(s)/sizeof(int);i++)
    {
    	printf("%d\t",s[i]);
	}
    return 0;
}
这种算法是将数组的第一个元素就设为key值,即中间值,然后从右寻找比key小的值,找到后停下,将找到的s[j]赋给s[i]即第一个元素,此时s[j]可以看作是一个坑,什么东西也没有,再从左边寻找比key大的值,找到后停下(前提i<j),然后将此值把s[j]这个坑下,重复此操作,直到i=j(i最后必定等于j),此时将key值赋给s[i]或s[j],完成第一轮分堆操作,此后递归调用再分左堆和右堆。
下面这个算法是《征服c指针》给出的:
#include<stdio.h>
#include<stdlib.h>
#define SWAP(a,b) {int temp;temp=a;a=b;b=temp;}
void quicksort2(int *s,int left,int right)
{
    int l=left,r=right;
    int key=(s[l]+s[r])/2;
    while(l<=r)
    {
        for(;s[l]<key;l++)//从左寻找
            ;
        for(;s[r]>key;r--)//从右寻找
            ;
        if(l<=r)
        {
            SWAP(s[l],s[r]);
            l++;
            r--;//这个操作是进行下一轮交换的预备
        }
    }
    //从循环出来后说明一轮分堆已完成
    if(r>left)//递归左堆
    {
        quicksort2(s,left,r);
    }
    if(l<right)//递归右堆
    {
        quicksort2(s,l,right);
    }
    //不满足条件即退出
}
int main()
{
	int i;
    int s[]={1,4,5,6,3,2,9};
    quicksort2(s,0,6);//数组长度记得减1
    for (i=0;i<sizeof(s)/sizeof(int);i++)
    {
    	printf("%d\t",s[i]);
	}
    return 0;
}
这种算法我目前还没完全掌握,与上一个其实是殊途同归,只不过不是填坑而是交换了。
我觉得目前其实都还没完全掌握快速排序,主要是还没实战过,代码写少了,既然这种排序算法更优,那么以后多用这种算法来排序。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章