今天搞了一下午的快速排序。。。对于自己这个学渣真的是没什么说的
整理一下,方便以后复习回顾。有什么错误和改进欢迎大家指出,不胜感激!!!
快速排序(Quicksort),又称划分交换排序(partition-exchange sort),快速排序采用了分治策略(分治法的基本思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。)
利用分治法可将快速排序的分为三步:
1.在数据集之中,选择一个元素作为”基准”(pivot)。
2.所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
3.对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
时间复杂度
最优时间复杂度 Ο(n log n)
最坏时间复杂度 Ο(n2)
平均时间复杂度 Ο(n log n)
空间复杂度 根据实现的方式不同而不同
其划分过程如图:
C语言实现代码如下:
int Partition(int *arr, int low, int high)
{
if (arr == NULL && low > high)
{
printf("input error");
}
int tmp = arr[low];
while (low < high)
{
while (low < high && tmp <= arr[high])
{
high--;
}
arr[low] = arr[high];
while (low <high && tmp >= arr[low])
{
low++;
}
arr[high] = arr[low];
}
arr[low] = tmp;
return low;
}
void QuickSort(int *arr, int low, int high)
{
if (low == high)
{
return ;
}
int par = Partition(arr, low, high);
if (low < high)
{
Partition(arr, low, par-1);
Partition(arr, par+1, high);
}
}
JAVA方法:
class quick_sort {
int[] arr;
private void swap(int x, int y) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
private void quick_sort_recursive(int start, int end) {
if (start >= end)
return;
int mid = arr[end];
int left = start, right = end - 1;
while (left < right) {
while (arr[left] <= mid && left < right)
left++;
while (arr[right] >= mid && left < right)
right--;
swap(left, right);
}
if (arr[left] >= arr[end])
swap(left, end);
else
left++;
quick_sort_recursive(start, left - 1);
quick_sort_recursive(left + 1, end);
}
public void sort(int[] arrin) {
arr = arrin;
quick_sort_recursive(0, arr.length - 1);
}
}
JavaScript方法:
Array.prototype.quick_sort = function() {
var len = this.length;
if (len <= 1)
return this.slice(0);
var left = [];
var right = [];
var mid = [this[0]];
for (var i = 1; i < len; i++)
if (this[i] < mid[0])
left.push(this[i]);
else
right.push(this[i]);
return left.quick_sort().concat(mid.concat(right.quick_sort()));
};
var arr = [5, 3, 7, 4, 1, 9, 8, 6, 2];
arr = arr.quick_sort();
for (i = 0; i < arr.length; i++)
document.body.innerHTML += arr[i] + " ";
document.body.innerHTML += "<br>";
参考来源: