基础算法之排序算法
基础的排序算法分为快排和归并排序还有桶排,堆排等等这些不是我们主要的讨论内容,我们这次主要是讲快排和归并。
我们先从快排开始:1.快排的主要思想是基于分治来做的。首先我们在数组中任意取一个点,这个点可以是左右的端点也可以是区间的中值点,就是任意一点。
2.确定完分界点之后就可以调整区间了,令分界点为X吧,小于等于X的值放在X的左边,大于X的值放在右边,保证这个条件成立即可,如果相等的话在左边还是右边都是可以的。
3.最后使用递归的方法处理左右两端,然后排好序之后两个部分合在一起就是这整个数组的排序。
以上是整体的一个大概思想。
我们可以利用这个思想写一个最容易想到的方法:同时开辟两个新的数组内存(取名a数组,b数组),然后取一个数X,然后让他们依次和X进行对比,如果数大于X就存倒b数组中如果小于X存入a数组中,如果相等存入任意一个数组即可(任意一个指a数组或b数组)。然后再用递归的方法排序,然后将两个数组拼接在一起即可。
然而我们还有一种更好的方法不需要开辟多余的内存而且时间的复杂度也不变,下面我将详细的讲述一下这个方法:
首先,先声明两个指针,这两个指针分别从数组的两端向中间靠拢,,具体就是两个指针一个指向第一个元素,第二个指针指向数组的最后一个元素,然后让两个指针分别向中间靠拢,每指向一个数就让它和选取的X进行大小比较如果比X大应该放在右边就先,然后停下来不动,等右端的指针指向了一个比X小的数需要放到X的左边,这时将两个指针所指向的数进行交换,交换结束后让指针指向交换位置的下一个位置,遇到相等的数可以不交换,两个指针相遇停下即可。读者请仔细研读上述内容,理解最好。
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
以上是快速排序的代码模板可以帮助理解