快速排序
来源:互联网 发布:淘宝母婴用品货源 编辑:程序博客网 时间: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;}
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- android从服务器下载文件(php+apache+win7+MySql)
- 关于Java网络编程的几个实例
- SQL2008单一的Windows身份验证改为混合模式身份验证(部分是转载)
- 黑马程序员_图形化界面
- c 获取文件 MD5 值
- 快速排序
- ASP.NET MVC 3 JSON 返回时间格式处理
- Explaination of exchanging values of two parameters via XOR
- 在项目中选择串口号的方法
- 面试题整理(二)
- 介绍一个简单的串口类,同一时间只能读或写
- LVS-DR的理解和配置
- Andengine
- MySQL日期相关函数