C语言 选择排序

选择排序思路解释


比如有一组数:a1,a2,a3,a4,a5,a6需要排序(假设要求升序排列)

第一轮:先从a1到a6这6个数中找出最小的数,放在数组第一个位置;即遍历a1到a6,找出最小的数与a1交换;
第二轮:因为已经排好最小的数,现在找“第二小”的数,放在数组第二个位置;即遍历a2到a6,找到第二小的数字之后与a2交换;
第三轮:从a3到a6中找出第三小的数字,将它与a3交换;
第四轮:类推;
第五轮:类推;第五轮结束后整个排序结束。

我们需要用到两个for循环:
外层的for循环用于控制“位置”,比如第一轮的a1,第二轮的a2,里面都是排好序的数字。
内层的for循环用于走访剩余未排序的数字,遍历寻找最小值。

选择排序&冒泡排序异同

  1. 冒泡排序是每次与相邻的数字比较大小,一言不合就交换顺序,每一轮需要多次交换;而选择排序有了选择的过程,选择好最大(小)值之后再交换,即一轮比较只需要交换一次。
  2. 冒泡排序是固定数字,给这个数字找合适的位置安放(这个数字应该排在哪里);选择排序是固定位置寻找符合这个位置条件的数字(这个位置是第几小的数字)。
  3. 冒泡排序简单易懂,稳定,时间复杂度低,空间复杂度高,效率低;选择排序一轮比较只需交换一次,但不稳定(每一轮交换后原始序列的顺序被打乱)。

代码

#include
#include
/*选择排序:每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,
然后再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。*/
void swap(int *x,int *y)//交换x、y
 {
     
	int temp = *x;
	*x = *y;
	*y = temp;
}
void SelectionSort(int len,int arr[])//选择排序
{
      
//i
	for (int i = 0; i < len-1;i++)
	 {
     
		int min = i;
		for (int j = i + 1; j < len;j++) //遍历未走访的元素
		{
     
			if (arr[min] > arr[j])
			 {
     
				min = j;//min始终记录当前比较轮中最小元素的数组下标	
			}	
		}
		swap(&arr[min], &arr[i]);//每一轮找出最小值之后交换
	}
}
void pnt(int len,int a[]) //打印
{
     
	for (int i = 0; i < len; i++) 
	{
     
		printf("%d ", a[i]);
	}
}
int main()
 {
     
	const int len = 8;
	int a[len] = {
     5,3,112,78,45,22,-34,-99};
	SelectionSort(len,a);
	pnt(len,a);
	return 0;
}

你可能感兴趣的:(数据结构,排序算法)