这周主要解决快排
1. 如果pivot不是第一个元素,就把选定的pivot元素和第一个元素swap,然后照流程走
2. int ChoosePivot(vector<int> & data, int start, int end) 选择median 元素做pivot的时候,记住中位数middle 不等于 (end - start + 1) / 2,而应该加上起点 middle = ((end - start + 1) / 2) + start - 1
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> data;
int compares = 0;
int Partition_First(vector<int> & data, int start, int end);
int Partition_Last(vector<int> & data, int start, int end);
int Partition_Middle(vector<int> & data, int start, int end);
int ChoosePivot(vector<int> & data, int start, int end);
void QuickSort(vector<int> & data, int start, int end);
int main() {
ifstream fin("in.txt");
int t = 0;
for(int i = 0; i < 10000; i++){
fin>>t;
data.push_back(t);
}
int tail = data.size() - 1;
QuickSort(data, 0, tail);
cout<<compares<<endl;
return 0;
}
void QuickSort(vector<int> & data, int start, int end) {
if(start >= end) return; // base case
int boundary = Partition_Middle(data, start, end);
QuickSort(data, start, boundary - 1);
QuickSort(data, boundary + 1, end);
}
int Partition_First(vector<int> & data, int start, int end) {
compares += (end - start);
int pivot = data[start];
int left = start + 1;
int right;
for(right = start + 1; right <= end; right++) {
if(data[right] < pivot) {
int temp = data[right];
data[right] = data[left];
data[left] = temp;
left++;
}
}
int temp = data[left - 1];
data[left - 1] = data[start];
data[start] = temp;
return (left - 1);
}
int Partition_Last(vector<int> & data, int start, int end) {
compares += (end - start);
//change the first and the last elements
int temp = data[end];
data[end] = data[start];
data[start] = temp;
int pivot = data[start];
int left = start + 1;
int right;
for(right = start + 1; right <= end; right++) {
if(data[right] < pivot) {
int temp = data[right];
data[right] = data[left];
data[left] = temp;
left++;
}
}
temp = data[left - 1];
data[left - 1] = data[start];
data[start] = temp;
return (left - 1);
}
int Partition_Middle(vector<int> & data, int start, int end) {
compares += (end - start);
int index = ChoosePivot(data, start, end);
int temp = data[index];
data[index] = data[start];
data[start] = temp;
int pivot = data[start];
int left = start + 1;
int right;
for(right = start + 1; right <= end; right++) {
if(data[right] < pivot) {
int temp = data[right];
data[right] = data[left];
data[left] = temp;
left++;
}
}
temp = data[left - 1];
data[left - 1] = data[start];
data[start] = temp;
return (left - 1);
}
int ChoosePivot(vector<int> & data, int start, int end) { //返回值是pivot的下标
int middle;
if( (end - start + 1) % 2 != 0) {
middle = ((end - start + 2) / 2) + start - 1 ;
} else {
middle = ((end - start + 1) / 2) + start - 1 ;
}
int a = data[start];
int b = data[end];
int c = data[middle];
if(b<=a&&a<=c) return start;
if(c<=a&&a<=b) return start;
if(a<=b&&b<=c) return end;
if(c<=b&&b<=a) return end;
if(a<=c&&c<=b) return middle;
if(b<=c&&c<=a) return middle;
}