快速排序的基本思想是通过一轮排序将待排数据分为独立的两部分,其中一部分数据的关键字均比另一部分的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序的目的 。就像切苹果一样,先将苹果分为两瓣,然后再分别对两瓣苹果继续进行切分,其中用到的就是递归的思想,话不多少,直接上代码:
#include"stdafx.h"
#include"stdlib.h"
#include"math.h"
using namespace std;
void swap(int k[], int low, int high) //交换函数
{
int temp;
temp = k[high];
k[high] = k[low];
k[low] = temp;
}
int Partition(int k[], int low, int high) //进行数据的排序
{
int point;
point = k[low];
while (low < high)
{
while (low < high&&k[high] >= point)
{
high--;
}
swap(k, low, high);
while (low < high&&k[low] <= point)
{
low++;
}
swap(k, low, high);
}
return high;
}
void Qsort(int k[], int low, int high) //进行递归
{
int point;
if (low < high)
{
point = Partition(k,low,high);
Qsort(k, low, point - 1);
Qsort(k, point + 1, high);
}
}
void quicksort(int k[], int n)
{
Qsort(k, 0, n-1);
}
int main()
{
int a[] = { 1,5,3,7,9,6,4 };
quicksort(a,7);
for (int i = 0; i < 7; ++i)
{
printf("%d", a[i]);
}
}
以上就是快排的实现代码,对上述代码进行优化的方法主要包括以下四种:1、优化选取枢轴 2、优化不必要的交换 3、使用尾递归优化递归操作 4、优化数组较小时的排序方案 下文展示了采用四种方法进行优化后的快排代码:
#include"stdafx.h"
#include"stdlib.h"
#include"math.h"
using namespace std;
#define MAX_LENGTH_INSERT_SORT 7
void swap(int k[], int low, int high)
{
int temp;
temp = k[high];
k[high] = k[low];
k[low] = temp;
}
void Isort(int k[], int n) //小数组用直接插入排序
{
int i, j, temp;
for(i=1;i<n;i++)
{
if (k[i] < k[i - 1])
{
temp = k[i];
for (j = i - 1; k[j] > temp; j--)
{
k[j + 1] = k[j];
}
k[j + 1] = temp;
}
}
}
void insertsort(int k[], int low,int high)
{
Isort(k + low, high - low + 1);
}
int Partition(int k[], int low, int high)
{
int m = low + (high - low) / 2; //三数取中法
if (k[high] > k[low])
swap(k, low, high);
if (k[high] < k[m])
swap(k, m, high);
if (k[m] > k[low])
swap(k, m, low);
int point;
point = k[low];
while (low < high)
{
while (low < high&&k[high] >= point)
{
high--;
}
k[low] = k[high];
while (low < high&&k[low] <= point)
{
low++;
}
k[high] = k[low];
k[low] = point;
}
return high;
}
void Qsort(int k[], int low, int high)
{
int point;
if ((high - low) > MAX_LENGTH_INSERT_SORT)
{
point = Partition(k, low, high);
Qsort(k, low, point - 1);
low = point + 1; //尾递归
}
else
insertsort(k,low,high);
}
void quicksort(int k[], int n)
{
Qsort(k, 0, n-1);
}
int main()
{
int a[] = { 1,5,3,7,9,6,4 };
quicksort(a,7);
for (int i = 0; i < 7; ++i)
{
printf("%d", a[i]);
}
}
至今快排算法在优化后,依然是排序算法里的王者,里面优化算法的思想需要学以致用,尾递归,三数取中法都是需要认真掌握的概念。