10.4 10.5 选择排序、插入排序、冒泡排序

选择排序:先找最小值,然后交换位置。

#include<iostream>
using namespace std;

int SelectionSort(int a[], int size)
{
	for(int i = 0; i < size - 1; ++ i)//最后一次不用比较 
	{
		int tmpMin = i;//假设第i个数最小 
		for(int j = i; j < size; ++ j)//寻找未比较数中的最小值 
		{
			if(a[j] < a[tmpMin])
				tmpMin = j;
		}
		int tmp;//交换位置 
		tmp = a[tmpMin];
		a[tmpMin] = a[i];
		a[i] = tmp;
	}
}

int main()
{
	int n, a[10];
	cin >> n;
	for(int i = 0; i < n; ++ i)
		cin >> a[i];
	SelectionSort(a,n);
	for(int i = 0; i < n; ++ i)
		cout << a[i] << " ";
	return 0;
}

选择排序(这种方法好一些)

插入排序:左边为有序部分,右边为无序部分。将无序部分的第一个数与有序部分比较,插入到有序部分中即可。

#include<iostream>
using namespace std;

int InsertSort(int a[], int size)
{
	for(int i = 1; i < size; ++ i)//无序部分(让无序部分的每一个数分别与有序部分比较) 
	{
		for(int j = 0; j < i; ++ j)//有序部分 
		{
			if(a[i] < a[j])//如果发现无序部分的数小于有序部分的某个数
			{
				int tmp = a[i];//必须要这一步,否则后面这一步会改变a[i]的值 
				for(int k = i; k > j ; -- k)//将有序部分的这个数及其以后的数依次往后移  
					a[k] = a[k-1];
				a[j] = tmp;
				break;//变为有序序列后即可跳出循环 
			}
		}
	}
 } 
 
int main()
{
	int n, a[10];
	cin >> n;
	for(int i = 0; i < n; ++ i)
		cin >> a[i];
	InsertSort(a,n);
	for(int i = 0; i < n; ++ i)
		cout << a[i] << " ";
	return 0;
}

插入排序

冒泡排序:整个数组都是无序序列,依次将相邻两个数比较,得到有序序列的第一个数(右边)

#include<iostream>
using namespace std;

void BubbleSort(int a[], int size)//从大到小排序
{
	for(int i = 0; i < size - 1; ++ i)
	{
		for(int j = 0; j < size - i; ++ j)//j < size - i,无序部分(左)需要两两比较排序 
		{
			if(a[j] < a[j + 1])
			{
				int tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
			} 
		}
	}
} 
int main()
{
	int n, a[10];
	cin >> n;
	for(int i = 0; i < n; ++ i)
		cin >> a[i];
	BubbleSort(a,n);
	for(int i = 0; i < n; ++ i)
		cout << a[i] << " ";
	return 0;
}

 

#include<iostream>
using namespace std;

void BubbleSort(int a[], int size)
{
	for(int i = size - 1; i > 0; -- i)
	{
		for(int j = 0; j < i; ++ j)//j < size - i,无序部分(左)需要两两比较排序 
		{
			if(a[j] < a[j + 1])//改变大小于符号即可改变排序规则 
			{
				int tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
			} 
		}
	}
} 
int main()
{
	int n, a[10];
	cin >> n;
	for(int i = 0; i < n; ++ i)
		cin >> a[i];
	BubbleSort(a,n);
	for(int i = 0; i < n; ++ i)
		cout << a[i] << " ";
	return 0;
}

 

这两种写法都正确,但是自我比较倾向于第二种写法。两种写法主要还是影响第二个for循环的表达方式,第二个for循环主要是指无序序列的范围,无序序列中的元素需要两两比较来交换数据。

很详细的冒泡排序:https://www.cnblogs.com/ahalei/p/3563964.html

猜你喜欢

转载自blog.csdn.net/yanyanwenmeng/article/details/81988059