Re:从零开始的算法学习【2】两种简单排序法

(一)选择法排序

原理:每一趟从待排序的数据元素中选择最小(大)的一个元素,顺序放在已排好序的数列最后,直到全部待排序的数据元素排完。

步骤:(1)从无序列中选择出最小值        (2)将选择出的最小值与无序列的第一个元素交换


#include<iostream>
using namespace std;

void select(int *a,int n)
{
	for(int i = 0;i<n-1;i++)       //从无序数组的第i=0个开始找起
	{
		for(int j = i+1;j<n;j++)         //与第i+1个(也就是后一个)做比较,如果比后一个大,则把小的交换到i的位置
		{
			if(a[i]>a[j])
			{
				int t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}
	for (int i = 0;i<n;i++)
	{
		cout << a[i] << " " << endl;
	}
}


int main()
{
	int a[5] = {2,5,4,1,3};
	select(a,5);
	return 0;
} 

(二)冒泡法排序

原理:(1)比较相邻元素。若第一个比第二个大,则交换        (2)对每一对相邻元素做同样操作,直到最后一对,这时最后一个元素应该是最大的        (3)重复操作,除了最后一个    (4)持续对越来越少的元素做同样操作,直到没有需要比较的数字

#include<iostream>
using namespace std;

void select(int *a,int n)
{
	for(int i = 0;i<n-1;i++)            //外层循环控制比较的次数,每一次内层循环比较完毕则最后一个数为最大数,所以i+1可以保证内层循环避免比较最后一个数
	{
		for(int j =0 ;j<n-i-1;j++)   //内层循环每次都从头比较
		{
			if(a[j]>a[j+1])
			{
				int t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}
	for(int i =0;i<n;i++)
	cout << a[i] << " "	 << endl;
}


int main()
{
	int a[5] = {5,4,2,1,3};
	select(a,5);
	return 0 ;
 } 

猜你喜欢

转载自blog.csdn.net/vincemar/article/details/80188552