直接插入排序和选择排序

匿名 (未验证) 提交于 2019-12-03 00:43:02

(一)直接插入排序

思路:

(1)用一个临时变量存放待排序的数字;

(2)从数组前依次遍历找第一个比待排序数字大的数字的位置;

(3)将从待排序的数字位置开始,到找的要插入的数字的位置之间的数字向后挪一位,最后将待排序数字插入到找到的位置;

代码如下:

 void Insert_Sort( int *arr,int len ) {    int tmp = 0;//当作哨兵位        for( int i = 1; i < len; ++i )        {       tmp = arr[i];       for( int j = 0 ; j < i ;++j )       {          if( tmp < arr[j] )//找到第一个比tmp大的数字;          {             break;          }       }    for( int k = i - 1 ;k >= j ;j-- )//将i-j之间的数字向后挪动一位,     {        arr[k+1] = arr[k];     } arr[j] = tmp ;//在j的位置插入待排序数字    } }

上述代码的时间复杂度为O(n^2),如果给出的数字本来就有序,即最好的情况下时间复杂度也为O(n^2),空间复杂度为O(1);

最好情况比如 12345 也是 O(n~2);从前往后找太浪费时间

优化:

采取从后往前找比待排序数字小的数字的位置,插入在此数字的后面,在没有找到之前将数字往后挪动一位;
最好情况 12345 时间复杂度是O(n);空间复杂度 O(1)

代码如下:

 void Insert_Sort2(int *arr,int len) { 	int i; 	int j; 	int tmp; 	for(i = 1; i < len; i++) 	{ 		tmp = arr[i]; 		for(j = i-1;j >= 0;j--)//从哨兵位之前开始  向前找  		{ 			if(arr[j] <= tmp)//找第一个比tmp小的数字  			{ 				break; 			} 			else 			{ 				arr[j+1]=arr[j];//没找到之前将数字往后挪 			} 		}  		arr[j+1] = tmp;//找到了将tmp插入在其后面 	} } 

(2)选择法排序

思路:

第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。代码如下:

 void Select_Sort(int *arr,int len) { 	for(int i = 0;i < len;i++) 	{ 		int minIndex = i; 		for(int j = i+1;j < len;j++) 		{ 			if(arr[j] < arr[minIndex]) 			{ 				minIndex = j; 			} 		} 		if(minIndex != i) 		{ 			int tmp = 0; 			tmp = arr[i]; 			arr[i] = arr[minIndex]; 			arr[minIndex] = tmp; 		} 	} } 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!