算法学习——快速排序

算法学习————快速排序


快速排序是一种很简单的算法,其平均时间复杂度为O(n log n),在最坏的情况下快速排序时间复杂度会降为O(n*n)。

算法简介

快速排序是二分法思想的一种应用,下面通过递归的方法表示执行过程

  1. 选择一个基数,可以选择数组中间的值作为基准。但它并不一定是中间的值,可以是任意值,甚至可以是不在排序数组的值。
  2. 分组,用下面的方法重新排序,所有比基准小的都放在左半部分,所有比基准大的放在右边,相等的可以保留在任意部位,数组不一定会被均分。
  3. 排序,应用上面的方法对左边和右边进行迭代。

分组过程

在每次开始分组的时候都有两个参数i和j,其中i指向开始的元素,j指向最后的元素。向前移动i直到找到大于等于基准的元素,j向后移动直到元素值,小于或等于基准。如果 i ≤ j,就交换两者的值,并且i指向下一个元素。j指向前一个元素,当i大于j时,算法结束。

分组完毕后,在第i项之前的元素全部不大于基准在第j项之后的元素全部不小于基准。
下面给出利用快排对 {1, 12, 5, 26, 7, 14, 3, 7, 2}排序。

Java实现

 int partition(int arr[], int left, int right)
{
      int i = left, j = right;
      int tmp;
      int pivot = arr[(left + right) / 2];
 
  while (i <= j) {
        while (arr[i] < pivot)
              i++;
        while (arr[j] > pivot)
              j--;
        if (i <= j) {//分组,交换两个元素位置
              tmp = arr[i];
              arr[i] = arr[j];
              arr[j] = tmp;
              i++;
              j--;
        }
  };
 
  return i;
}
void quickSort(int arr[], int left, int right) {
      int index = partition(arr, left, right);
      if (left < index - 1)
            quickSort(arr, left, index - 1);
      if (index < right)
            quickSort(arr, index, right);
}

看网上解释挖坑填数+分治法感觉挺好理解的,学习一下

static void quicksort(int n[], int left, int right) {
    int dp;
    if (left < right) {
        dp = partition(n, left, right);
        quicksort(n, left, dp - 1);
        quicksort(n, dp + 1, right);
    }
}

static int partition(int n[], int left, int right) {
    int pivot = n[left];
    while (left < right) {
        //从右到左,找比基准小的
        while (left < right && n[right] >= pivot)
            right--;
        if (left < right)
            n[left++] = n[right];//将right填充到left位置,此时s[left]和s[right]是同一个值,right另外的值填充
            //从左到右,找比基准大的值
        while (left < right && n[left] <= pivot)
            left++;
        if (left < right)
            n[right--] = n[left];//赋值给right
    }
    n[left] = pivot;//比较完left=right,将值填到这个坑里
    return left;
}

本文参考自 MoreWindows

posted on 2014-09-27 10:06  好好先生耶  阅读(134)  评论(0)    收藏  举报