简单的冒泡排序法

 每当不能够使用C++自带的sort函数排序的使用,第一反应,就是自己写个冒泡排序法,但是总是忘了怎么操作,每次写都需要百度。所以,这次决定对排序做个总结。首先介绍最简单的冒泡排序法:

int main()
{
	double w[10] = {9,1,5,8,3,7,4,6,2};
	int length = 9;

	for(int i=0;i<length-1;i++)
		for (int j = i + 1; j < length; j++)
		{
			if (w[i] > w[j])
			{
				double temp;
				temp=w[i];
				w[i] = w[j];
				w[j] = temp;
			}
		}
	
	for (int i = 0; i < length; i++)
		cout << w[i] << " ";


	return 0;
}

此种方法,每次排序,都可能将较小的数排序到后边去,造成重复操作。使用从后往前的比较,比较j和j+1不变动后边的数,循环一次,就讲小的数排在最前边

int main()
{
	double w[9] = { 9,1,5,8,3,7,4,6,2 };
	int length = 9;

	for (int i = 0; i < length - 1; i++)
		for (int j = length-2; j >= i; j--)
		{
			if (w[j] > w[j+1])
			{
				double temp;
				temp = w[j+1];
				w[j+1] = w[j];
				w[j] = temp;
			}
		}

	for (int i = 0; i < length; i++)
		cout << w[i] << " ";
	return 0;
}

 还有一种情况,即当待排序的数序列为{2,1,3,4,5,6,7,8,9}的时候,排序一次就能够得到得到结果。故增加一个标志位,当第二次查找,发现没有交换的时候,即后续的数,已经是正确的顺序,所以结束循环。有了标志位,对于已经排序好的数,确定是否排序成功,时间复杂度是(n-1)

int main()
{
	//double w[9] = { 9,1,5,8,3,7,4,6,2 };//数的此种序列是最坏情况
	double w[9] = {2,1,3,4,5,6,7,8,9};
	int length = 9;
	bool flag=true;
	int ans = 0;
	for (int i = 0; (i < length - 1) && flag; i++)
	{
		flag = false;
		ans++;
		for (int j = length - 2; j >= i; j--)
		{
			if (w[j] > w[j + 1])
			{
				double temp;
				temp = w[j + 1];
				w[j + 1] = w[j];
				w[j] = temp;

				flag = true;
			}
		}
	}
		

	for (int i = 0; i < length; i++)
		cout << w[i] << " ";

	cout <<endl<< ans;

	return 0;
}

 简单选择排序,每次排序之前,从后边的数中选择出最小的数,然后与最前边交换。此方法,由于每次选择了最小的书,所以极大的减少了交换次数。

int main()
{
	double w[9] = { 9,1,5,8,3,7,4,6,2 };
	//double w[9] = {2,1,3,4,5,6,7,8,9};
	int length = 9;
	int min;
	for (int i = 0; i<length-1; i++)
	{	
		min = i;
		for (int j = i+1; j <= length-1; j++)
		{
			if (w[min] > w[j])
				min = j;
		}
		if (min != i)
		{
			double temp;
			temp = w[i];
			w[i] = w[min];
			w[min] = temp;
		}
	}
		

	for (int i = 0; i < length; i++)
		cout << w[i] << " ";

	return 0;
}







猜你喜欢

转载自blog.csdn.net/weixin_37703648/article/details/79119391
今日推荐