排序算法(C++)实现

//选择排序  选择一个固定位置上的值和后面所有位置上的值做比较
void select_sort(int arr[], int len)
{
	//for (int i = 0; i < len - 1; ++i)
	//{
	//	for (int j = i + 1; j < len; ++j)
	//	{
	//		if (arr[i] > arr[j])
	//		{
	//			int temp = arr[i];
	//			arr[i] = arr[j];
	//			arr[j] = temp;
	//		}
	//	}
	//}
	int temp;
	int j;
	for (int i = 0; i < len - 1; ++i)
	{
		for (j = i + 1; j < len; ++j)
		{
			if (arr[i] > arr[j])
			{
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
}
//冒泡  两两相邻位置进行比较
void bubble_sort(int arr[], int len)
{
	int temp;
	int j;
	for (int i = 0; i < len - 1; ++i)
	{
		for (j = 0; j < len - 1 - i; ++j)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
//插入
void insert_sort(int arr[], int len)
{
	int temp;
	int j;
	for (int i = 1; i < len; ++i)
	{
		temp = arr[i];//保存下一个待插入的元素
		j = i - 1;
		while (j >= 0 && temp < arr[j])
		{
			arr[j + 1] = arr[j];
			--j;
		}
		arr[j + 1] = temp;
	}
	//int temp;
	//int j;
	//for (int i = 1; i < len; ++i)
	//{
	//	temp = arr[i];//保存下一个待插入的元素
	//	for (j = i - 1; j >= 0 && temp < arr[j]; --j)
	//	{
	//		arr[j + 1] = arr[j];
	//	}
	//	arr[j + 1] = temp;
	//}

	//int temp;
	//int j;
	//for (int i = 1; i < len; ++i)
	//{
	//	temp = arr[i];//保存下一个待插入的元素
	//	for (j = i - 1; j >= 0; --j)
	//	{
	//		if (temp < arr[j])
	//		{
	//			arr[j + 1] = arr[j];
	//		}
	//		else
	//			break;
	//	}
	//	arr[j + 1] = temp;
	//}

	//int temp;
	//int j;
	//for (int i = 1; i < len; ++i)
	//{
	//	for (j = i - 1; j >= 0; --j)
	//	{
	//		if (arr[j + 1] < arr[j])
	//		{
	//			temp = arr[j + 1];
	//			arr[j + 1] = arr[j];
	//			arr[j] = temp;
	//		}
	//		else
	//			break;
	//	}
	//}
}

//希尔排序(可看成由插入排序延伸而来)
void shell_sort(int arr[], int len)
{
	int temp;
	int j;
	int jump = len >> 1;//步长
	while (jump != 0)
	{
		for (int i = jump; i < len; ++i)
		{
			temp = arr[i];//保存下一个待插入的元素
			j = i - jump;
			while (j >= 0 && temp < arr[j])
			{
				arr[j + jump] = arr[j];
				j = j - jump;
			}
			arr[j + jump] = temp;
		}
		jump = jump >> 1;
	}
}

//基数(桶)排序
void radix_sort(int arr[], int len)
{
	int temp[10][10] = {};
	for (int n = 1; n < 10000; n *= 10)//1000表示arr里面最大的数值不会超过1000
	{
		for (int i = 0; i < 10; ++i)
		{
			for (int j = 0; j < 10; ++j)
				temp[i][j] = -1;//初始化,不一定要是-1,只是这个数在待排序数组中没有即可
		}

		for (int i = 0; i < len; ++i)
		{
			int tempIndex = (arr[i] / n) % 10;
			temp[tempIndex][i] = arr[i];
		}

		int k = 0;
		for (int i = 0; i < 10; ++i)
		{
			for (int j = 0; j < 10; ++j)
			{
				if (temp[i][j] != -1)
					arr[k++] = temp[i][j];
			}
		}
	}
}
//快排和归并都是使用递归的排序,两者的效率都很高,
//合并操作
void _merge_in_arr(int arr[], int left, int mid, int right)//用来处理合并
{
	//准备一个辅助数组
	int length = right - left + 1;//确定数组的长度
	int *pData = new int[length];
	//内存逐字节设置值(第1个参数表示内存首地址,第2个参数表示设置的值,第3个参数表示要设置多少个第2个参数)
	memset(pData, 0, sizeof(int)* length);

	//合并
	int low = left;//定义一个变量接住左边下标的值(表示左区间第一个元素的下标)
	int hig = mid + 1;//表示右区间第一个元素的下标
	int index = 0;//表示辅助数组的下标

	while (low <= mid && hig <= right)//并不清楚左区间和右区间的大小,low <= mid表示左区间还有值 hig <= right表示右区间还有值
	{
		while (low <= mid && arr[low] <= arr[hig])//如果左边区间没有越界,且左区间的数值<=右区间的数值 
		{
			pData[index++] = arr[low++];
		}
		while (hig <= right && arr[low] > arr[hig])//如果右边区间没有越界,且右区间的数值<左区间的数值 
		{
			pData[index++] = arr[hig++];
		}
	}

	//到这一步,证明起码有一个区间是合并完成的,接下来把还剩下的区间的数拷贝进辅助数组即可
	if (low <= mid)//证明左区间并没有合并完成,右区间完成了合并
		memcpy(&pData[index],&arr[low],sizeof(int) * (mid -low + 1));//内存拷贝,三个参数,表示把第二个参数做为首地址,拷贝第三个参数大小的数据给到第1个参数
	if (hig <= right)
		memcpy(&pData[index], &arr[hig], sizeof(int)* (right - hig + 1));

	//到这一步,辅助数组里面已经有一个排好序的序列了
	memcpy(&arr[left], pData, sizeof(int)* length);
	delete[]pData;
}
//归并排序
void _merge(int arr[], int left, int right)//通过left和right下标,把arr分成两个逻辑区域
{
	if (left >= right)//当左和右下标一致时,证明这个区间只有一个元素
		return;
	int mid = ((right - left) >> 1) + left;
	_merge(arr, left, mid);//递归左区间
	_merge(arr, mid + 1, right);//递归右区间
	//合并操作
	_merge_in_arr(arr, left, mid, right);
}

//归并
void merge_sort(int arr[], int len)
{
	_merge(arr, 0, len - 1);
}

//快排
void quick_sort(int arr[], int low, int hight)
{
	int t = arr[low];//确定标杆的值
	int f = low + 1;//待确定区域的第一个下标
	int b = hight;//待确定标杆区域的最后一个下标

	if (low >= hight) return;//表示只有一个元素,无需定位
	int tempVal;
	while (f <= b)//待定位的区间存在
	{
		while (f <= b && arr[f] <= t) f++;//f一直找比标杆大的元素
		while (f <= b && arr[b] >= t) b--;//b一直找比标杆小的元素
		if (f < b)//定位区间没有搜索完成
		{
			tempVal = arr[f];
			arr[f] = arr[b];
			arr[b] = tempVal;
			f++;
			b--;
		}
	}
	arr[low] = arr[b];
	arr[b] = t;
	quick_sort(arr, low, b - 1);
	quick_sort(arr, b + 1, hight);
}

以上算法涉及有选择排序,冒泡排序,插入排序,希尔排序,桶排序,归并排序,快速排序,它们的效率是各不相同的,其中冒泡排序的的效率几乎最低,选择排序虽然理论上上与冒泡排序的效率一样,但是实际要快于冒泡排序,桶排序是整型数字排序最快的但是其排序是需要使用大量的空间,所以其空间复杂度较大。下面是一些关于排序算法效率的表格。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值