Bootstrap

数据结构(C++版)——三种简单排序算法

简单选择排序法(升序)

第一步:找到数组中第一个元素到最后一个元素中最小的值,并记录其位置为k。
  第二步:若最小的元素不是第一个元素,则将最小元素的值与第一个元素的值交换,即交换a[1]与a[k]。
  第三步:找到数组中第二个元素到最后一个元素中最小的值,同上方法与第二个元素交换。ps:此时第一个元素为数组中的最小值,第二个元素为数组中第二小的值。

  第n步:找到数组中第n-1个元素到第n个元素中最小的值,即若a[n]>a[n-1],交换两者的值。

void solution(int a[],int n)
{
	int temp;//用于交换 
	for(int i=0;i<n-1;i++)
	{
		int k=i;//用k来寻找最小元素的位置 
		for(int j=i+1;j<n;j++)
		{
			if(a[j]<a[k]) k=j;//找到a[i]后最小元素的位置 
		}
		if(a[k]!=a[i])
		{
			temp=a[k];
			a[k]=a[i];
			a[i]=temp;//交换a[i]与后面最小的元素 
		} 
	} 
	 
} 

冒泡排序法(升序)

冒泡排序算法的关键在于每个元素通过与邻位的元素进行比较与交换(从倒数第二个元素与最后一个元素比较开始),从而使数组中最小的值“上浮”到第一个位置,接着让第二个元素到最后的元素中最小的值“上浮”到第二个位置,然后是第三个,第四个…
举个例子,有以下数列{2,4,3,1},首先比较3和1,交换变成{2,4,1,3}。然后比较4和1,交换变成{2,1,4,3},再比较2和1,变成{1,2,4,3},通过这种方式把最小的1移到第一位,之后比较4和3,变成{1,2,3,4},比较2和3,位置不变,可以看到现在第二小的2在第二位,之后比较3和4,完成排序。

void solution(int a[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++) 
	{
		for(j=n-2;j>=i;j--)//冒泡核心,当i=0时从最后2个一直移到最前2个                            
		{                  //当i等于1时从最后两个一直移到第2和第3个
			if(a[j]>a[j+1])//若前者大于后者 
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;//交换a[j]与a[j+1] 
			} 
		}
	}	 
} 

直接插入排序(升序)

直接插入排序相比前两种排序算法稍显复杂,建议根据算法从第一步开始慢慢地理解。首先大致理解其思路,就是先先将无序数组中的第一个数视为一个有序数组(但这个有序数组只有一个数),将原来无序数组中的第2个数插入到有序数组中,使之形成包含两个数的有序数组,之后插第三个、第四个…第n个。
  具体是如何插入的呢?首先比较a[1]与a[2],若a[1]<a[2]则不变,若a[1]>a[2],则将a[2]的值赋值给a[0](a[0]为空,有效数组是从a[1]到a[n]的),之后将a[1]赋值给a[2],将a[0]赋值给a[1],此时a[1]与a[2]是有序排列的,之后比较a[2]与a[3],同理若a[2]>a[3]则将a[3]的值赋值给a[0],之后将a[2]赋值给a[3]。比较a[0]与a[1]的大小,若a[0]<a[1],则将a[1]赋值给a[2],a[0]赋值给a[1];若[0]>a[1],则将a[0]直接赋值给a[2](这里是重点,即通过比较a[0]与已经形成的有序数组分别从后往前进行比较,寻找最恰当的位置进行插入),现在a[1],a[2],a[3]已经成为有序数列,之后的a[4],a[5]…a[n]同理。
  举个例子,有以下无序数组{4,2,1,3},分别记为a[1],a[2],a[3],a[4]。比较4和2的大小,因为4大于2,所以变成2,4,2,1,3,之后a[1]向后移,a[0]向后移,变成2,2,4,1,3。比较4和1,把1移到最前面,变成1,2,4,1,3,因为1比2和4都小,于是先后移4,再后移2,再后移1,变成1,1,2,4,3。比较4和3,把3移到最前面,变成3,1,2,4,3,比较3(a[0])和4,4往后移,变成3,1,2,4,4,比较3(a[0])和2,把3赋值给2后面的4,于是变成3,1,2,3,4,不计a[0],即完成了排序。

void solution(int a[],int n)
{
	int i,j;
	 for(i=1;i<n;i++)//循环n-1次,即插入n-1个数 
	 {
 		if(a[i+1]<a[i])//准备把a[i+1]插入有序数组中 
 		{
		 	a[0]=a[i+1];//a[0]辅助用 
		 	for(j=i;a[j]>a[0];j--)
		 	{
	 			a[j+1]=a[j];
	 		}
	 		a[j+1]=a[0];//核心,把a[0]插入到有序数组中的合适位置 
		 }
 	} 
} 
;