Stanford 算法入门 week 2 Assignment QuickSort

这周主要解决快排
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; 
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值