1、选择排序
选择排序就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之;
选择排序的主要优点与数据移动有关。
如果某个元素位于正确的最终位置上,则它不会被移动。
选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对 n 个元素的表进行排序总共进行至多 n - 1 次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
选择排序的算法步骤如下:
-
在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
-
然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;
-
以此类推,直到所有元素均排序完毕。
void SelectSort(SqList *L) { int i, j, min,count1,count2; count1 = count2 = 0; for (i = 1; i < L->length;i++) { min = i; //将当前下标定义为最小值下标 for (j = i + 1; j <= L->length;j++) //循环之后的数据 { count1++; if (L->r[min]>L->r[j]) //如果由小于当前最小值的关键字 min = j; //更新最小值 } if (i != min) //若是我们在上面循环中找到最小值,则min会改变,与i不同,就需要进行交换 { swap(L, i, min); count2++; } } printf("loop count:%d, swap count:%d ", count1, count2); }
简单选择排序的性能要略优于冒泡排序