语言中的排序主要分为了以下几类,如比较类排序有冒泡排序、快速排序、菜单选择排序、堆排序、简单插入排序、希尔排序;非比较类排序有计数排序、横排序、基数排序。
本期文章简单讲解一下快速排序
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
将数组中所有元素都跟一个基准元素pivot比(随意选取,常取第一个或最后一个),比pivot小的划分成左边一块,比pivot大的划分成右边一块,得到两个子问题。然后递归处理这两个子问题即可。
1.分解:数组arr[left,right]被分为两个子数组arr[left,pivot-1]和arr[pivot+1,right] 使得arr[left,pivot-1]中的元素都小于等于arr[pivot],而arr[pivot+1,right] 中的元素都大于等于arr[pivot]。
2.解决:通过递归调用快速排序,对两个子数组arr[left,pivot-1]和arr[pivot+1,right]进行排序。
3.合计:两个子数组合并。
取基准的方法:
public class quickSort {
int low = left;
int high = right;
if (low >= high) { return arr; }
int pivot = arr[low];
while (low < high) {
while (low < high) {
while (low < high && pivot <= arr[high]) {
high--;
}
arr[low] = arr[high];
while (low < high && arr[low] <= pivot) {
low++;
}
arr[high] = arr[low];
}
arr[low] = pivot;
sort(arr, left, low - 1);
sort(arr, low + 1, right);
return arr;
}
public static void main(String[] args) {
quickSort q = new quickSort();
int[] arr = new int[] {6,2,3,1,5};
q.sort{arr, 0, arr, length - 1 };
System.out.println(Arrays.toString(arr));
}
};
推导过程
可参考:快速排序
解法一:
#include"Sort.h"
template
class quickSort
{
public:
inline virtual vectorsort(vector& arr, T left, T right)
{
T low = left;
T high = right;
if (low >= high)
return arr;
T pivot = arr[low];
while (low < high)
{
while (low < high && pivot <= arr[high])
high--;
arr[low] = arr[high];
while (low < high)
low++;
arr[high] = arr[low];
}
arr[low] = pivot;
sort(arr, left, low--);
sort(arr, low + 1, right);
return arr;
}
};
int main(int argc, char const* argc[])
{
quickSort* q = new quickSort;
vectorarr{6, 2, 3, 1, 5};
q->sort(arr, 0, arr, size() - 1);
print(arr);
return 0;
}
解法二:
int partition(vector& arr, int left, int right)
{
int mid = (right + left) >> 1;
swap(arr[left], arr[mid]);
int pivot = arr[left];
while (left < right)
{
while (left < right && privot <= arr[left])
{
left++;
}
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
void sort(vector& arr, int left, int right)
{
if (left < right)
{
int pivot = partition(arr, left, right);
sort(arr, left, pivot - 1);
sort(arr, pivot + 1, right);
}
}