基本思想:

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

算法步骤: 

 快速排序(quickSort)

快速排序(quickSort)

快速排序(quickSort)

快速排序(quickSort)

快速排序(quickSort)

 快速排序(quickSort)

快速排序(quickSort)

对左右区间重复上述,直到各区间只有一个数

例子:

快速排序(quickSort)

快速排序(quickSort)

代码实现:

package SortType;

import java.util.Arrays;

public class QuickSort {
    public static void main(String[] args)
    {
        int[] arr={-15,-6,0,7,9,23,54,82,101};
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void quickSort(int[] arr,int left,int right)
    {
        if(left>=right)
        {
            return;//注意!!!!!!!!记得写
        }
        int i=left,j=right;

        int temp=arr[left];

        while(i<j)
        {
            while (i<j&&arr[j]>=temp)
            {
                j--;
            }
            while(i<j&&arr[i]<=temp)
            {
                i++;
            }
            if(i<j)
            {
                int temp2=arr[j];
                arr[j]=arr[i];
                arr[i]=temp2;
            }
        }
        arr[left]=arr[i];
        arr[i]=temp;
        quickSort(arr,0,i-1);
        quickSort(arr,i+1 ,right);
    }

}

快速排序算法的性能与划分是否对称有关,设计随机化的快速排序算法解决划分对称性问题,将算法编程实现;并回答:对于一个随机化算法,为什么只分析其平均情况下的性能,而不分析其最坏情况下的性能?

答:  快速排序算法的性能与其运行时间与划分是否对称有关

最坏情况:

  1. 两个区域分别包含n-1个元素和1个元素。
  2. 时间复杂性 :           快速排序(quickSort)                    快速排序(quickSort)

最好情况:

  1. 每次划分都产生两个大小为n/2的区域:
  2. 时间复杂度:          快速排序(quickSort)               快速排序(quickSort)

快速排序算法的性能取决于划分的对称性。可以采用随机选择策略的快速排序算法。

在数组还没有被划分时,在arr[left,right]中随机选出一个元素作为划分基准,可以使划分基准的选择是随机的,从而可以期望划分是较对称的。

代码实现:

package SortType2;
import java.util.Arrays;
public class QuickSort {
    public static void main(String[] args)
    {
        int[] arr={5,3,1,9,8,2,4,7};
        quick(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void quick(int[] arr,int left,int right)
    {
        while (left>=right)
        {
            return;
        }
        int i=left;
        int j=right;
        int k=(int)(Math.random()*(right-left+1))+left;//从数组中随机选择一个数作为基准点
        int temp=arr[k];
        arr[k]=arr[left];
        arr[left]=temp;//将以基准点放在数组下标为0的位置--》容易判断
        int firstIndex=left;
        int first=arr[firstIndex];
        while (i<j)
        {
            while (i<j&&arr[j]>=first)
            {
                j--;
            }
            while (i<j&&arr[i]<=first)
            {

               i++;
            }
            if(i<j)
            {
                int temp2=arr[j];
                arr[j]=arr[i];
                arr[i]=temp2;
            }
        }
        arr[firstIndex]=arr[i];
        arr[i]=first;
        quick(arr,left,i-1);
        quick(arr,i+1,right);
    }
}

 

相关文章:

  • 2021-07-04
  • 2022-12-23
  • 2022-12-23
  • 2021-09-23
  • 2021-11-19
  • 2021-09-29
猜你喜欢
  • 2021-07-05
  • 2021-11-08
  • 2021-06-02
  • 2021-06-19
  • 2021-09-29
相关资源
相似解决方案