纯手撸——选择排序
思想:
- 找到最小的元素与第一个元素交换
- 剩下元素中再找最小的元素与第二个元素交换
- 以此类推
今天仍旧看图写代码,实现起来超级快:
初始时肯定给定一个无序数组:
先从这些元素中选出一个最小的(或最大的),和第一个元素进行交换,这样第一个元素就是最小的,第一个元素位置就变成有序区间了
同理,在剩下的无序区间选择最小的元素,将最小元素与无序区间的第一个元素进行交换,交换后原来无序区间的第一个元素就变为有序区间的最后一个元素了,有序区间递增一
以此类推,全部元素就可以通过这样不断地选择以及交换排完序
疑难处:如何选出最小的一个元素呢?
很容易想到:先随便选一个元素假设它为最小的元素(默认为无序区间第一个元素),然后让这个元素与无序区间中的每一个元素进行比较,如果遇到比自己小的元素,那更新最小值下标,直到把无序区间遍历完,那最后的最小值就是这个无序区间的最小值
不难写出:
void SelectSort(int a[],int n)
{
int i,j,min;
for (i = 0; i < n-1; i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[min])
{
min=j; //找到最小值
}
}
if(min!=i) //第一个元素就是最小元素就不动
{
//swap 这里交换的是最小值和无序区间第一个元素
int tmp=a[min];
a[min]=a[i];
a[i]=tmp;
}
}
}