您的位置:首页 > 其它

算法学习——快速排序

2014-09-27 10:06 204 查看

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

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

算法简介

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

选择一个基数,可以选择数组中间的值作为基准。但它并不一定是中间的值,可以是任意值,甚至可以是不在排序数组的值。

分组,用下面的方法重新排序,所有比基准小的都放在左半部分,所有比基准大的放在右边,相等的可以保留在任意部位,数组不一定会被均分。

排序,应用上面的方法对左边和右边进行迭代。

分组过程

在每次开始分组的时候都有两个参数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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: