各种Sort(还有堆排序桶排序基排序没写)

void InsertSort(vector<int>& vec) {//stable
	int sz = vec.size();
	for (int wall = 1; wall < sz; ++wall) {
		for (int index = wall; index > 0 && vec[index] < vec[index - 1]; index--) 
			swap(vec[index], vec[index - 1]);
	}
}

void BubbleSort(vector<int>& vec) {//stable
	int sz = vec.size();
	for (int wall = 0; wall < sz - 1; ++wall) {
		for (int i = sz - 1; i > wall; i--) {
			if (vec[i] < vec[i - 1]) swap(vec[i], vec[i - 1]);
		}
	}
}

void SelectSort(vector<int>& vec) {//not stable
	int sz = vec.size();
	for (int wall = 0; wall < sz - 1; ++wall) {
		int minm = wall;
		for (int index = wall + 1; index < sz; ++index)
			if (vec[index] < vec[minm]) minm = index;
		swap(vec[minm], vec[wall]);
	}
}

//shellsort  not stable
void Insertsort(vector<int>& vec, int begin, int dist) {
	int sz = vec.size();
	for (int wall = begin + dist; wall < sz; wall += dist) {
		for (int index = wall; index > begin && vec[index] < vec[index - dist]; index -= dist) {
			swap(vec[index], vec[index - dist]);
		}
	}
}
void ShellSort(vector<int>& vec) {
	int sz = vec.size();
	for (int i = sz / 2; i >= 1; i /= 2) {
		for (int j = 0; j < i; ++j) {
			Insertsort(vec, j, i);
		}
	}
}

//quicksort
//因为支点定在最右边,所以循环从左开始,保证停止的地方的值大于等于pivot
int findmid(vector<int>& vec, int b, int e) {
	int pivot = vec[e];
	while (b < e) {
		while (vec[b] < pivot) ++b;
	    while (e>b && vec[e] >= pivot) --e;
		swap(vec[b], vec[e]);
	}
	return b;
}
void QuickSort(vector<int>& vec,int begin,int end) {
	if (begin >= end) return;
	int mid = findmid(vec, begin, end);
	swap(vec[mid], vec[end]);
	QuickSort(vec, begin, mid - 1);
	QuickSort(vec, mid + 1, end);
}


void MergeSort(vector<int>& vec) {
	if (vec.size() == 1) return;
	int mid = vec.size() / 2;
	vector<int>vec1(vec.begin(), vec.begin() + mid);
	vector<int>vec2(vec.begin() + mid, vec.end());
	MergeSort(vec1);
	MergeSort(vec2);
	merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec.begin()); 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值