快速排序

思路

1.对于一个数组,首先先选择一个基准值key,这个基准值可以随意选,但是一般选择的是这个数组的第一个元素a[0]
2.之后我们对于这个数组,把数组中所有比这个基准值key小的元素向基准值key的左边扔,把数组中所有比这个基准值key大的元素朝基准值key的右边扔
3.这样的话基准值key就成为了一个"分界线",所有比基准值key小的元素都在基准值key的左边,所有比基准值key大的元素都在key的右边
4.之后我们在递归的对基准值key左边的序列和右边的序列进行快速排序
5.最终整个序列就是有序的了

图解


转载自http://www.pianshen.com/article/3751395422/

代码实现

package sort;

public class QuickSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a= {10,9,8,7,6,5,4,3,2,1,0};
        for(int k:a)
        {
            System.out.printf("%d ",k);
        }
        System.out.println();
        quickSort(a, 0, a.length-1);
        for(int k:a)
        {
            System.out.printf("%d ",k);
        }

    }

    public static void quickSort(int a[],int left,int right)
    {
        if(left>=right)
        {
            return ;
        }
        int i=left;
        int j=right;
        int key=a[left];
        while(i<j)
        {
            while(i<j&&key<a[j])//从右向左找到第一个比key小的值
            {
                j--;//朝前面寻找
            }
            a[i]=a[j];//找到之后向左移动
            while(i<j&&key>a[i])
            {
                i++;//从左向右找,找到第一个大于key的值
            }
            a[j]=a[i];//将比较大的值移动到右边

        }
        a[i]=key;//把key移动到中间来分割左右,i现在是分割左右的下标
        quickSort(a, left, i-1);
        quickSort(a, i+1, right);

    }

}

复杂度

  • 时间复杂度:O(nlogn)
  • 空间复杂度:快速排序使用递归,递归使用栈,因此它的空间复杂度为O(logn)
  • 稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法
02-12 07:18