#include <iostream>
using namespace std;
int Partition(int *data, int length, int start, int end);
int Partition2(int *data, int length, int start, int end);
void quickSort(int *data, int length, int start, int end){
if (start < 0 || end < start || data == NULL)
return;
int pivot = Partition2( data, length, start, end);
if (pivot > start)
quickSort(data, length, start, pivot - 1);
if (pivot < end)
quickSort(data, length, pivot + 1, end);
}
void swap(int &d1, int &d2){
int temp = d1;
d1 = d2;
d2 = temp;
}
//思路:首元素作为pivot值,将首元素放到数组末尾,然后依次将数组值与data[end]比较
int Partition(int *data, int length, int start, int end){
//选第一个元素
swap(data[start], data[end]);
int small = start - 1;//是数组的坐标
for (int index = start; index != end; index++){
if (data[index] < data[end]){
small++;
if (small != index){
swap(data[index], data[small]);
}
}
}
small++;//pivot的位置
swap(data[small], data[end]);
return small;
}
//大话数据结构中的方案,选头元素为pivot值,在交换过程中,pivot为end或start位置上的值
int Partition2(int *data, int length, int start, int end){
//三选一,将中等大小的数值放在数组的开头
int mid = (end - start) / 2 + start;
if (data[start] > data[mid])
swap(data[start], data[mid]);
if (data[mid] > data[end])
swap(data[mid], data[end]);
if (data[start] < data[mid])
swap(data[start], data[mid]);
int pivot = data[start];
//pivot值不是在end就是在start
while (end > start){
while (end > start && data[end] >= pivot)
end--;
swap(data[start], data[end]);
while (end > start && data[start] <= pivot)
start++;
swap(data[start], data[end]);
}
return start;
}
快速排序
最新推荐文章于 2021-11-19 16:57:43 发布