快速排序 java
来源:互联网 发布:dojo.js 传参 编辑:程序博客网 时间:2024/05/24 01:35
一直想复习下算法,先把经典的快排复习下,好好理解下分治思想:
先介绍快速排序的算法过程:
[1].记录第一个数位置和最后一个数位置; int i = low; int j = high;[2].找到主元位置,可以是第一个数,也可以是最后一个,或者随机的一个位置,一般可以以数组中第一个位置的数,
int povit = a[low],主元选择好了就记录不改变它的值;
[3].如果主元是第一个数,则由 j 从后向前搜索,直到找到第一个小于主元的数,与主元进行交换位置.
[4].然后由 i 从前向后搜索,找到第一个大于主元的数,并与主元交换位置.
[5].重复[3],[4]步骤,直到 i = j;
a[0] ..........a[7]
12,3,5,44,21,8,56,2
主元:a[0] = 12;
-----------------------------------------------------------------
2,3,5,44,21,8,56,12 i = 1; j = 7;
2,3,5,12,21,8,56,44 i = 3;j =6;
---------------------- 一趟完成,开始第二趟------------------------
2,3,5,8,21,12,56,44 i = 4;j = 5;
2,3,5,8,12,21,56,44 i = 4;j = 4;
---------------------- 一趟完整移位结束,主元移到了 4 的位置------------------------
----------------------此时由主元位置分为前后2个数组-------------------------------
{2,3,5,8} 12 {21,56,44}
----------------------递归对前后2个数组进行上述移位操作---------------------------
而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度下界为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为O(nlogn)。
- package test;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.Properties;
- public class test {
- public static void main(String args[])
- {
- test t = new test();
- Comparable a[] = {12,3,5,44,21,8,56,2};
- t.quickSort(a, 0, a.length-1);
- for(Comparable c : a)
- {
- System.out.print(c.toString()+",");
- }
- }
- public void quickSort(Comparable a[],int low,int high)
- {
- if(low < high)
- {
- int i = partition(a,low,high);
- //再递归移位i前面一个数组
- quickSort(a, low,i-1);
- //再递归移位i后面一个数组
- quickSort(a, i+1, high);
- }
- }
- public int partition(Comparable a[],int low,int high)
- {
- int i = low;
- int j = high;
- //主元
- Comparable pivot = a[low];
- if(low<high)
- {
- while(i != j)
- {
- printA(a);
- //从j开始往前扫描直到第一个小于主元的数字出现,与主元交换
- while(i < j)
- {
- if(a[j].compareTo(pivot) < 0)
- {
- swap(a, j,i);
- break;
- }
- j--;
- }
- if(i < j)
- {
- //此时,因为与i互换了位置,i需要向后移动一位
- i++;
- }
- //从i开始往后扫描,直到第一个大于主元的数字出现,与主元交换
- while(i<j)
- {
- if(a[i].compareTo(pivot) > 0)
- {
- swap(a,i,j);
- break;
- }
- i++;
- }
- if(i<j)
- {
- //此时,因为与j互换了位置,j需要向前移动一位
- j--;
- }
- printA(a);
- }
- }
- return i;
- }
- public int partition2(Comparable a[],int l, int r)
- {
- int i = l, j = r;
- Comparable x = a[l]; //s[l]即s[i]就是第一个坑
- while (i < j)
- {
- // 从右向左找小于x的数来填s[i]
- while(i < j && a[j].compareTo(x) >= 0)
- j--;
- if(i < j)
- {
- a[i] = a[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
- i++;
- }
- // 从左向右找大于或等于x的数来填s[j]
- while(i < j && a[i].compareTo(x) < 0)
- i++;
- if(i < j)
- {
- a[j] = a[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
- j--;
- }
- }
- //退出时,i等于j。将x填到这个坑中。
- a[i] = x;
- return i;
- }
- public void swap(Comparable a[],int i, int j)
- {
- Comparable temp = a[i];
- a[i] = a[j];
- a[j] = temp;
- }
- public void printA(Comparable a[])
- {
- for(Comparable c : a)
- {
- System.out.print(c.toString()+",");
- }
- System.out.println();
- }
- }
- 排序-快速排序-Java
- java排序之快速排序
- Java排序算法 快速排序
- 快速排序(java排序)
- java 快速排序,冒泡排序
- 算法:排序----Java快速排序
- 【交换排序】快速排序--Java
- java 插入排序+快速排序
- Java 排序之 快速排序
- java排序之快速排序
- Java排序算法:快速排序
- Java排序-快速排序
- Java排序算法:快速排序
- Java排序算法--》快速排序
- JAVA排序算法---快速排序
- Java 快速排序 归并排序
- Java排序算法--快速排序
- java 冒泡排序、快速排序
- j2se之泛型接口
- CSDN課後感想
- Windows7 开机后桌面黑屏如何解决?
- Android屏幕适配
- Boost 学习之三 GGL
- 快速排序 java
- csdn第一天课实训总结
- Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)
- Android---文字中插入表情
- ImageView中显示SD卡上的图片
- web服务器boa移植
- vb输出1000到2000内能同时被17和37整除的数
- Linux入侵检查实用指令
- Android 开发中使用SAX解析xml小结