排序(1)———选择排序及其优化
一 选择排序
对于一般的选择排序,对于我们来说已经很熟悉了,代码如下:
void _sort(int a[],int n)//从小到大排序 { int i,j,temp; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } }
这种选择排序存在缺陷,如果我输入
5 1 2 3 4 5
它实际上是不需要排序的。
那么,如何对选择排序进行改进呢?
1.不妨定义一个变量 k(标记变量),来标记本轮比较中最小的位置,假设初始元素a[i]最小,将其下标作为标记变量的初始值 k = i。
2.然后让后面的所有元素 a[i] 分别与 a[k] (最小值)作比较,如果比 a[k] 还小,只需要将最小值下标 j 赋给变量k即可。
3.在外循环结束后,标记的变量如果不指向初始元素(即判断i与k是否相等),说明最小值不在初始位置,这时候让初始元素与标记位置的元素进行交换即可,如果指向初始元素,则不需交换。
代码如下:
void _sort(int a[],int n) { int i,j,temp,k; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) {if(a[k]>a[j]) k=j; } if(i!=k) { temp=a[i]; a[i]=a[k]; a[k]=temp; } } }