快速排序

快速排序,也是和归并排序一样,都是采用分治法结合递归来实现的。快速排序原理是,通过选取一个关键数据(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.c
author:suju
date:2012-9-16

method:
    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;
}



 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值