在插入排序的基础上形成了分组插入排序,即希尔排序。在交换排序,即冒泡排序的基础上,形成了快速排序。冒泡排序,是相邻的元素进行比较和交换,所以交换次数会很多。而快速排序,加大了元素比较和交换的距离,故减少了交换次数。快速排序,是以数组某元素为轴,排序后,把数组分为两部分。大于轴元素的排在其后面,小于等于轴元素的排在其前面。递归进行。直到待排序的子数组长度为1。该算法是递归的。一般以数组首元素为轴。
改进的快速排序:
(1)修正轴元素的值,其值确保为关键字中大小居中的值,避免为最大关键字值或最小关键字值,使得递归树接近于完全二叉树。
(2)轴元素的值另行保存,在每一次划分过程partition中,只调整不等于轴元素值的记录位置,待划分结束,确定了轴元素的最终位置后,再把轴元素回存入数组。
(3)大数组采用快速排序,小数组直接用直接插入排序。一般认为数组元素数小于7,即为小数组。
以下是完整代码,和改进后的快速排序代码,测试后都是正确的。
#include<iostream>
using namespace std;
void swap(int & i, int & j) {
int temp = i;
i = j;
j = temp;
}
int partition(int array[],int first,int end) {
while (first < end) {
while (first < end && array[end] >= array[first])
end--;
if (first < end) {
swap(array[first], array[end]);
first++;
}
while (first < end && array[first] <= array[end])
first++;
if (first < end) {
swap(array[first], array[end]);
end--;
}
}
return first;
}
void quickSort(int array[],int first,int end) {
if (first >= end)
return;
int pivotIndex = partition(array,first,end);
quickSort(array,first,pivotIndex - 1);
quickSort(array,pivotIndex + 1,end);
}
void directInsert(int array[], int first, int end) {
int tempKey;
for (int i = first + 1; i <= end; i++) {
tempKey = array[i];
int j = i - 1;
while (j >= 0 && array[j] > tempKey) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = tempKey;
}
}
int partitionBetter(int array[], int first, int end) {
int mid = (first + end) / 2;
if (array[first] > array[end])
swap(array[first], array[end]);
if (array[mid] > array[end])
swap(array[mid], array[end]);
if (array[mid] > array[first])
swap(array[mid], array[first]);
int pivotKey = array[first];
while (first < end) {
while (first < end && array[end] >= pivotKey)
end--;
if (first < end) {
array[first] = array[end];
first++;
}
while (first < end && array[first] <= pivotKey)
first++;
if (first < end) {
array[end] = array[first];
end--;
}
}
array[first] = pivotKey;
return first;
}
void quickSortBetter(int array[], int first, int end) {
if (end - first > 6) {
int pivotKey = partitionBetter(array, first, end);
quickSortBetter(array, first, pivotKey - 1);
quickSortBetter(array, pivotKey + 1, end);
}
else
directInsert(array, first, end);
}
void dispaly(int array[], int length) {
for (int i = 0; i < length; i++)
cout << array[i] << ' ';
cout << endl;
}
int main() {
int length = 10;
int a[] = {9,0,1,5,8,7,4,2,3,6};
quickSort(a,0,length - 1);
// quickSortBetter(a,0,length - 1);
dispaly(a,length);
return 0;
}
谢谢阅读