JAVA排序算法之快速排序

JAVA排序算法之快速排序

基本思想:

通过一趟排序将要排序的数据分割为独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分分别进行快速排序,
整个排序可以用递归进行完成,
以此达到整个数据变成有序序列.

算法介绍

1.选取数组中的第一个数据作为关键数据,赋值给key,即key=a[0];
2.定义两个整形变量,i,j,i = 0;j = a.length -1,即i指向数组的第一
位数据,j指向数组的最后一位数据;
3.key的值与最后一位,即下标为j的数据相比较,如果key的值小于
a[j],再将key的值与a[j-1]相比较,一直找到比key的值小的数据,然后将
a[0]=key的值与该数据进行交换;
4.任然是这个key,且已知道交换后的下标的值,再从前往后,即a[0]与key
相比较,如果a[0]的值小于key,再将a[1]的值与key相比较,直到找到一个
下标i,a[i]>key,然后将a[i]的值与key进行交换
5.不断重复步骤三与步骤四,直到key左边的值都比key小,key右边的值,都
比key大,则第一轮循环结束
6.key右边的数据看成一个数组,再执行步骤15key左边的数据看成一
个数组,执行步骤15,最终得到一个有序的数组

特点:

时间复杂度:
最坏情况下为O(n^2)
最好情况下为O(nlonn)

空间复杂度:
最优情况下为:O(logn)
最差情况下为:O(n)

java代码实现

package com.lanou3g;

public class demo04 {
    public static void main(String[] args) {
        int[] a = {25,1,5,7,3,99,9,6,0,2,14,9,77,12,33};//初始数组
        sort(a,0,14);//调用sor函数,分别传入数组名,起始下标,末位下标

    }
    public static void sort(int arr[],int low,int high) {
        int l = low;   //l接收首位下标
        int h = high;  //接收末位下标
        int key = arr[low];  //key为关键字
        while (l < h ) {   //判断循环是否结束,即key是否与数组中的元素都比较了一次
            while(l < h && key <= arr[h]) {
                h --;  //从后向前找比key小的数据
            }
            if(l < h) {  //交换key与a[h]的值
                int temp = arr[h];
                arr[h] = arr[l];
                arr[l] = temp;  
                l++;  //交换完毕后,l++,此时a[l]的值必然小于key,没必要再比较,所以i+1
            }
            while(l < h && arr[l] <= key) {
                l ++;   //从前往后找比key大的数
            }
            if(l < h) { //找到此数时,交换key与a[i]的值
                int temp = arr[h];
                arr[h] = arr[l];
                arr[l] = temp;
                h--; //h的值必然大于key,所以没必要再比较,因此h减1
            }
        }

        if(l > low)   //此时l==h,a[l]==a[h]==key
          sort(arr, low,l-1);  //将key左边的值与下标传入函数sort
        if(h//将key右边的下标传入函数sort
            sort(arr, h+1, high);
        for(int i = 0;i <= 14;i++) { //打印结果
             System.out.print(arr[i]+" ");
        }
        System.out.println();
     }

}

结语

此代码可直接复制运行,希望对各位有所帮助

你可能感兴趣的:(JavaSE)