浅谈几种排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xianqianshi3004/article/details/82777085

冒泡排序:

void Bubble(vector<int>&src) {
	int size = src.size();
	for (int i = 0; i < size; i++) {
		for (int j = i + 1; j < size; j++) {
			if (src[i] > src[j])
				swap(src[i], src[j]);
		}
	}
}

简单选择排序:每次选择当前序列中最小值

void Select(vector<int>&src) {
	int size = src.size();
	int min = 0;
	for (int i = 0; i < size; i++) {
		min = src[i];
		for (int j = i+1; j <size; j++) {
			if (min > src[j])
				swap(min, src[j]);
		}
		src[i] = min;
	}
}

插入排序:当前元素往前遍历,找到合适的位置插入。

void Insert(vector<int>&src) {
	int size = src.size();
	int flag = 0;
	int start = 0;
	int end = 0;
	for (int i = 1; i < size; i++) {
		flag = src[i];
		if (src[i] >= src[i - 1])//如果待插入元素和前一个元素相同则跳过;
			continue;
		for (int j = i-1; j >=0; j--) {
			if (src[i] >= src[j])
			{
				start = j+1;//从当前位置的后一位开始往后移动;
				end = i;//移动到当前需要插入的元素的位置;
				break;
			}
		}
		for (int m = end; m > start; m--) {//
			src[m] = src[m - 1];
		}
		src[start ] = flag;
	}
}

快速排序:先找到一个中枢然后把它放在正确的位置然后对两边的序列进行快速排序;

void Quick(vector<int>&src, int low, int high) {
	if (low >= high)
		return;
	int part = Part(src, low, high);
	Quick(src, low, part);
	Quick(src, part + 1, high);
}
int Part(vector<int>&src,int low,int high) {
	int size = src.size()-1;
	int flag = src[low];
	while (low<high)
	{
		while (flag <= src[high]&& low<high)
			high--;
		src[low] = src[high];
		while (flag >= src[low]&& low<high)
			low++;
		src[high] = src[low];
	}
	src[high] = flag;
	return high;
}

堆排序:先把无序序列建立大顶堆或者小顶堆,然后交换当前序列的最后一个元素和堆顶元素,交换后,把剩下的元素再调整成堆结构;我的代码以大顶堆为例。

void HeapDownAdjust(vector<int> &src, int start, int end)
{
	for (int i = start*2+1; i <= end; i=i*2+1) {
		if (i + 1 <= end&&src[i] < src[i + 1]) 
			i++;
		if (src[start] < src[i])
		{
			swap(src[start], src[i]);
			start = i;
		}
		else
			break;
	}
}
void HeapSort(vector<int> &src, int n) {//n是数组的长度;
	for (int j = n / 2 - 1; j >= 0; j--) {
		HeapDownAdjust(src, j, n-1);
	}
	for (int x = n - 1; x >= 0; x--) {
		swap(src[0], src[x]);
		HeapDownAdjust(src, 0, x - 1);//从第一个节点进行换;
	}
}

归并排序

void Mergin(vector<int> &src, int left, int mid, int right, vector<int> &re) {
	int i = left, j = mid+1;
	while (i<=mid&&j<=right)
	{
		if (src[i] <=src[j])
		{
			re[left++] = src[i];
			i++;
		}
		else {
			re[left++] = src[j];
			j++;
		}
	}
	if (i > mid) 
		while (j <= right)
			re[left++] = src[j++];
	else
		while (i <= mid)
			re[left++] = src[i++]; 
}
void MerginSort(vector<int> &src, int left, int right, vector<int>&re) {
	if(left < right)
	{
		int mid = (right + left)/2;
		MerginSort(src, left, mid,re);
		MerginSort(src, mid + 1, right,re);
		Mergin(src, left, mid, right,re);
		for (int i = left; i <= right; i++) {
			src[i] = re[i];
		}
	}
}

猜你喜欢

转载自blog.csdn.net/xianqianshi3004/article/details/82777085