快速排序(JAVA描述)
2016-03-30 14:33
337 查看
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
现象:可比较我的其他算法现象
组建数组元素个数:10000000(千万)
组件随机数组运行时间:233ms
排序运行时间:78ms
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
现象:可比较我的其他算法现象
组建数组元素个数:10000000(千万)
组件随机数组运行时间:233ms
排序运行时间:78ms
import java.util.Random; public class QuitSort { public static void show(int [] a){ for(int i=0;i<a.length;i++){ System.out.print(a[i]+"、"); } System.out.println(); } public static int[] get_intarr(int len){ long begin = System.currentTimeMillis(); Random ran = new Random(); int [] result = new int[len]; for(int i=0;i<len;i++){result[i] = ran.nextInt(100); } long runtime = System.currentTimeMillis()-begin; System.out.println("组建数组元素个数:"+len); System.out.println("组件随机数组运行时间:"+runtime); return result; } /** * 将a[begin]放在一个位置,左边小于a[begin],右边大于a[begin] * @param a 数组 * @param begin 起始位置[以此为标准] * @param end 结束位置 */ public static int adjustArray(int []a,int begin,int end){ int tmp = a[begin]; int i=begin,j=end; while(i<j){ //从右至左找到小于tmp的数,然后a[i]=a[j],调换位置 while(i<j && a[j]>=tmp){ j--; } if(a[j]<tmp){ a[i] = a[j]; i++; } //从左至右找到大于tmp的数,然后a[j]=a[i],调换位置 while(i<j && a[i]<=tmp){ i++; } if(a[i]>tmp){ a[j] = a[i]; j--; } } a[i]=tmp; return i; } /** * 递归将begin位置数字放置正确位置,直至begin=last * @param a * @param begin * @param last */ public static void quickSort(int []a,int begin,int last){ if(begin < last){ int i = adjustArray(a, begin, last); adjustArray(a,begin,i-1); adjustArray(a, i+1, last); } } public static void main(String[] args) { int a[] = get_intarr(10000000); long begin = System.currentTimeMillis(); quickSort(a,0,a.length-1); long runtime = System.currentTimeMillis()-begin; System.out.println("排序运行时间:"+runtime); // show(a); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- JavaScript演示排序算法
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序