一、排序算法的基本分类:
插入排序类:直接插入排序--------(改进)-------->希尔排序
选择排序类:简单选择排序--------(改进)-------->堆排序
归并排序类:归并排序
交换排序类:冒泡排序--------(改进)-------->快速排序
二、快速排序算法基本思想:
利用分治法的思想,在序列中任选一个记录作为基准(由自己设定),以此基准将当前无序序列划分为左、右两个较小的子序列,并使左边子序列中所有记录的关键字均小于等于基准记录的关键字,右边子序列的所有记录的关键字均大于等于基准记录的关键字。基准记录无需参与后续的排序。
通过递归调用对左、右子序列进行同样的快速排序,直到序列的长度为1时,递归结束。
快速排序与归并排序算法上的区别:
快速排序在两个递归调用结束后,其序列已有序。对快速排序而言,“回归”的过程无须做什么,可以看成是空操作。——快速排序的排序过程是在“递”的阶段就完成了,而归并排序的排序过程是在“归”的阶段完成的。
三、快速排序的代码实现:
思路:
定义下标low和high,分别指向当前序列的第一个元素和最后一个元素。对当前序列调用排序函数,指定基准元素(可取序列的第一个元素为基准元素),当基准位置右边的元素大于等于基准元素时,不进行操作,只将high–;当基准位置右边的元素小于基准元素时,将两者互换。当基准位置左边的元素小于等于基准元素时,不进行操作,只将low++;当基准位置左边的元素大于基准元素时,将两者互换,直到下标low = high为止,此时完成了对当前序列的左子序列和右子序列的划分。再递归分别实现左子序列和右子序列的划分,直到low = high(序列长度为1)时,递归结束,也就完成了快速排序。
#include<iostream>
using namespace std;
void swap(int a[], int low, int high) //元素交换函数
{
int temp = a[low];
a[low] = a[high];
a[high] = temp;
}
int QSort(int a[], int low, int high) //排序函数,实现基准位置的确定和左右子序列的划分
{
int point;
point = a[low]; //设定基准元素为序列第一个元素
while (low < high)
{
while (low < high && point <= a[high])
{
high--;
}
swap(a, low