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