C++实现八大排序

#include<iostream>
#include<vector>
using namespace std;

//选择排序
void selectSort(vector<int>&vec)
{
	int n = vec.size();
	for (int i = 0; i < n - 1; ++i)
	{
		int min = i;
		for (int j = i + 1; j < n; ++j)
		{
			if (vec[min] > vec[j])
				min = j;
		}
		if (min != i)
			swap(vec[min], vec[i]);
	}
}

//冒泡排序
void bulletSort(vector<int>&vec)
{
	int n = vec.size();
	for (int i = 0; i < n - 1; ++i)
	{
		bool flag = true;
		for (int j = 0; j < n - i - 1; ++j)
		{
			if (vec[j] > vec[j + 1])
			{
				swap(vec[j], vec[j + 1]);
				flag = false;
			}
		}
		if (flag)
			return;
	}

}

//插入排序
void insertSort(vector<int>&vec)
{
	int n = vec.size();
	int j;
	for (int i = 1; i < n; ++i)
	{
		int tmp = vec[i];
		for (j = i - 1; j >= 0 && vec[j] > tmp; --j)
			vec[j + 1] = vec[j];
		vec[j + 1] = tmp;
	}

}

//希尔排序
void shellAjust(vector<int>&vec,int gap,int start)
{
	int n = vec.size();
	int j;
	for (int i = start+gap; i < n; i+=gap)
	{
		int tmp = vec[i];
		for (j = i - gap; j >= 0 && vec[j] > tmp; j-=gap)
			vec[j + gap] = vec[j];
		vec[j + gap] = tmp;
	}
}

void shellSort(vector<int>&vec)
{
	int n = vec.size();
	for (int gap = n / 2; gap > 0; gap /= 2)
	{
		for (int start = 0; start < gap; start++)
			shellAjust(vec,gap,start);
	}

}


//堆排序
void heapAjust(vector<int>&vec, int start, int end)
{
	int father = start;
	int child = 2 * father + 1;
	while (child < end)
	{
		if (child+1<end&&vec[child]<vec[child + 1])
			child++;
		if (vec[child] > vec[father])
			swap(vec[child],vec[father]);
		father = child;
		child = 2 * father + 1;
	}
}

void heapSort(vector<int>&vec)
{
	int n = vec.size();
	for (int i = n / 2 - 1; i >= 0; --i)
	{
		heapAjust(vec, i, n);
	}
	swap(vec[0],vec[--n]);
	while (n)
	{
		heapAjust(vec, 0, n);
		swap(vec[0],vec[--n]);
	}
}



//归并排序
void merge(vector<int>&vec, int left, int mid, int right)
{
	vector<int>help(right - left+1);
	int i = left;
	int j = mid+1;
	int index = 0;
	while (i <= left && j <= right)
	{
		if (vec[i] >= vec[j])
			help[index++] = vec[j++];
		else
			help[index++] = vec[i++];
	}
	while(i<=mid)
		help[index++] = vec[i++];
	while(j<=right)
		help[index++] = vec[j++];
	index = left;
	for (int i = 0; i <= right - left; ++i)
		vec[index++] = help[i];
}

void mergeSort(vector<int>&vec, int left, int right)
{
	if (left >= right)
		return;
	int mid = (left + right) >> 1;
	mergeSort(vec,left,mid);
	mergeSort(vec, mid + 1, right);
	merge(vec,left,mid,right);

}


//快速排序
void quickSort(vector<int>&vec, int left, int right)
{
	if (left > right)
		return;
	int flag = vec[left];
	int i = left;
	int j = right;
	while (i !=j)
	{
		//从右边找到小于基准值的值
		while (vec[j] > flag&&i < j)
			j--;
		//从左边找到大于基准值的值
		while (vec[i] <= flag&&i < j)
			i++;
		swap(vec[i], vec[j]);
	}
	swap(vec[i], vec[left]);
	//将中值左右两侧的数据分别进行递归排序
	quickSort(vec,left,i-1);
	quickSort(vec,i+1,right);
}


//求数据的最大位数,决定排序次数
int maxBit(vector<int>&vec, int n)
{
	int d = 1;
	int p = 10;
	for (int i = 0; i < n; ++i)
	{
		while (vec[i] >= p)
		{
			p *= 10;
			d++;
		}
	}
	return d;
}

//基数排序
void radixSort(vector<int>&vec, int n)
{
	int d = maxBit(vec, n);
	vector<int>tmp(n);
	int count[10];
	int i, j, k;
	int radix = 1;
	for (int i = 1; i <= d; ++i)
	{
		for (j = 0; j < 10; ++j)
			count[j] = 0;
		for (j = 0; j < n; ++j)
		{
			k = (vec[j]/radix) % 10;
			count[k]++;
		}
		for (j = 1; j < 10; j++)
			count[j] = count[j - 1] + count[j];//将tmp中的位置依次分配给每个桶
		for (j = n - 1; j >= 0; --j)
		{
			k = (vec[j] / radix) % 10;
			tmp[count[k] - 1] = vec[j];
			count[k]--;
		}
		for (j = 0; j < n; j++)
			vec[j] = tmp[j];
		radix *= 10;
	}

}


int main()
{
	vector<int>vec = { 9,8,100,7,6,5,4,3,2,1 ,10,3,2,22};
	int n = vec.size();
	//selectSort(vec);
	//bulletSort(vec);
	//insertSort(vec);
	//shellSort(vec);
	//heapSort(vec);
	//mergeSort(vec,0,--n);
	//quickSort(vec, 0, --n);
	radixSort(vec, n);
	for (int i = 0; i < n; ++i)
		cout << vec[i] << " ";
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值