各种排序

17 篇文章 1 订阅
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

void bubleSort(std::vector<int>& vec)
{
	auto size = vec.size();
	bool flag = false;

	for(decltype(size) i = 0; i < size; i++)
	{
		flag = false;
		for(decltype(size) j = 0; j < size - 1 -i; j++)
		{
			if(vec[j] > vec[j + 1])
			{
				flag = true;
				std::swap(vec[j], vec[j+1]);
			}
		}

		if(not flag)
		{
			break;
		}

	}

}

void selectSort(std::vector<int>& vec)
{
	auto size = vec.size();
	int minIndex;

	for(decltype(size) i = 0; i < size; i++)
	{
		minIndex = i;
		for(decltype(size) j = i + 1; j < size; j++)
		{
			if(vec[minIndex] > vec[j])
			{
				minIndex = j;
			}
		}
		std::swap(vec[minIndex], vec[i]);
	}
}


void insertSort(std::vector<int>& vec)
{
	auto size = vec.size();

	for(decltype(size) i = 1; i < size; i++)
	{
		if(vec[i] < vec[i-1])
		{
			int j = i - 1;
			int tmp = vec[i];

			while(j >= 0 and tmp < vec[j])
			{
				vec[j+1] =vec[j];
				j--;
			}

			vec[j+1] = tmp;
		}
	}
}

void quickSort(std::vector<int>& vec, int low , int high)
{
	if(low >= high)
	{
		return ;
	}

	int first = low;
	int last = high;

	int key = vec[first];

	while( first < last)
	{
		while(first < last and vec[last] > key)
		{
			last--;
		}

		if(first < last)
		{
			vec[first++] = vec[last];
		}

		while(first < last and vec[first] <= key)
		{
			first++;
		}

		if(first < last)
		{
			vec[last--] = vec[first];
		}
	}

	vec[first] = key;

	quickSort(vec, low, first -1);
	quickSort(vec, first + 1, high);
}

void shellSortCore(std::vector<int>& vec, int gap, int i)
{
	int insertNum = vec[i];
	int j;

	for(j = i - gap; j >= 0 and insertNum < vec[j]; j-=gap)
	{
		vec[j+gap] = vec[j];
	}

	vec[j + gap] = insertNum;

}

void shellSort(std::vector<int>& vec)
{
	auto size = vec.size();
	for(decltype(size) gap = size/2; gap > 0; gap /=2)
	{
		for(decltype(size) i = gap; i < size; i++)
		{
			shellSortCore(vec, gap, i);
		}
	}

}

void mergeSort(vector<int>& data)
{
	int size = data.size();
	vector<int> tmp(size, 0);

	for(int seg = 1; seg < size; seg += seg)
	{
		for(int start = 0; start < size; start += seg + seg)
		{
			int low = start;
			int mid = std::min(start + seg, size);
			int high = std::min(start + seg + seg, size);

			int index = low;
			int start1 = low;
			int end1 = mid;
			int start2 = mid;
			int end2 = high;

			while(start1 < end1 and start2 < end2)
			{
				tmp[index++] = data[start1] < data[start2] ? data[start1++] : data[start2++];
			}

			while(start1 < end1)
			{
				tmp[index++] = data[start1++];
			}

			while(start2 < end2)
			{
				tmp[index++] = data[start2++];
			}
		}

		std::swap(data, tmp);
	}

}


void heapify(vector<int>& nums, int n, int i)//对有一定顺序的堆,
//当前第i个结点取根左右的最大值(这个操作称heapfiy)
{
	int l = i * 2 + 1;
    int r = i * 2 + 2;
	int max = i;

	if (l<n && nums[l]>nums[max])
	{
		max = l;
	}
	if (r<n && nums[r]>nums[max])
	{
		max = r;
	}

	if (max != i)
	{
		swap(nums[max], nums[i]);
		heapify(nums, n, max);
	}
}
void heapify_build(vector<int>& nums, int n)//建立大根堆,从树的倒数第二层第一个结点开始,
//对每个结点进行heapify操作,然后向上走
{
	int temp = (n - 2) / 2;
	for (int i = temp; i >= 0; i--)
	{
		heapify(nums, n, i);
	}

	for (int i = 0; i < nums.size(); i++)
		cout << nums[i] << " ";
	cout << endl;
}

void heapify_sort(vector<int>& nums)
//建立大根堆之后,每次交换最后一个结点和根节点(最大值),
//对交换后的根节点继续进行heapify(此时堆的最后一位是最大值,因此不用管他,n变为n-1)
{
	int n = nums.size();
	heapify_build(nums, n);
	for (int i = 0; i < n; i++)
	{
		swap(nums.front(), nums[n - i - 1]);
		heapify(nums, n - i - 1, 0);
	}
}

int main()
{
	std::vector<int> vec = {9, 7, 8, 6, 1, 3, 2, 4};
	//bubleSort(vec);
	//selectSort(vec);

	//insertSort(vec);

	//quickSort(vec, 0, vec.size() - 1);
	//shellSort(vec);
	//mergeSort(vec);
	heapify_sort(vec);

	for(const auto& iter : vec)
	{
		cout << iter << " ";
	}

	cout << endl;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值