快速排序

来源:互联网 发布:淘宝母婴用品货源 编辑:程序博客网 时间:2024/06/05 20:57

快速排序,也是和归并排序一样,都是采用分治法结合递归来实现的。快速排序原理是,通过选取一个关键数据(key),通常是第一个数据,然后通过排序,将比关键数据小的数据排在key前面,比key大的数据排在后面。这样,数列就通过key分为了两部分,在通过递归,继续快排通过key分割开的左右两个数列,最后,形成一个有序表。

学习了,顺手写下来,记在博客里。

快速排序java表示:

package suju.hello;/* * name:QuickSort * author:suju * date:2012-9-15 *  */public class QuickSort {public static void main(String[] args) {/*example*/int num[]={398,23,554,76,97,3,22,77,333,886,33,3,76,4};quicksort(num,0,num.length);for (int i=0;i<num.length;++i){System.out.print(num[i]+",");}}/*quicksort 递归分治方法*/public static void quicksort(int[] num,int start,int end){/*start 开始索引,end 结束索引*/if (end-start<2){return;}/*当开始索引和结束索引之间只包含一个元数时,退出*/else{int mid=sort(num,start,end);/*sort快排,并返回中间分界数索引*/quicksort(num,start,mid);//right/*右边递归快拍*/quicksort(num,mid+1,end);//left/*左边递归快拍*/}}/*快速排序方法*/public static  int sort(int[] num,int start,int end){int i,j,key;/*声明变量*/i=start;j=end-1;/*初始化变量,end-1,因为数组索引从0开始*/key=num[i];/*定义一个分界数,默认为第一个数*/while (i<j){/*当i<j到时候进行遍历*/while (i<j && num[j]>=key ){j--;/*当j索引前到数大于key时,j--,继续判断*/}num[i]=num[j];/*当j索引前到数小于key,赋值给num[i]数*/while (i<j && num[i]<=key){i++;/*当i索引前数小于key时,i++继续判断*/}num[j]=num[i];/*当i索引前数大于key时,上面num[j]数赋值给num[i]*/}num[i]=key;/*最后退出循环,将key赋值给num[i]*/return i;/*返回i索引*/}}


顺便在熟悉下c语言。

#include <stdio.h>#include <stdlib.h>/*name:quicksort.cauthor:sujudate:2012-9-16method:    void quicksort(int* num,int start,int end);         //排序分治函数    int sort(int* num,int start,int end);               //数组快排函数*//*声明函数*/void quicksort(int* num,int start,int end);int sort(int* num,int start,int end);/*Example*/int main(){    int num[]={56,44,22,22,603,265,6898,6562,20,35};    quicksort(num,0,10);    int i;    for(i=0;i<10;i++){        printf("%d%c",num[i],',');    }}/*分治函数*/void quicksort(int* num,int start,int end){    /*    field:    num 待排序数组    start   起始索引    end     结束索引    */    if ((end-start)<2){ return;}                /*结束和起始索引之间只包含一个元素时返回*/    else{        int mid=sort(num,start,end);            /*返回一次快排后中间分隔数索引*/        quicksort(num,start,mid);        quicksort(num,mid+1,end);               /*对num数组进行左右递归排序,每次递归更改起始和结束索引*/    }}int sort(int* num,int start,int end){    int i,j,key;                                    /*声明变量*/    i=start;j=end-1;    key=num[i];                                     /*初始化索引值和对比关键数据key*/    while (i<j){        while (i<j && num[j]>=key){            j--;        }        num[i]=num[j];                              /*从j开始向前遍历,查找第一个小于key的数。*/        while (i<j && num[i]<=key){            i++;        }        num[j]=num[i];                              /*从i开始向后遍历,查找第一个大于key的数。*/    }    num[i]=key;                                     /*当i=j时,一个快排结束,并返回key的索引*/    return i;}



 


原创粉丝点击