选择排序的思想是怎么样的?
在一趟中,遍历一遍。我们知道最小的,应该也会知道最大的,所以,上面的选择排序是可以优化的。
时间复杂度
优化程序分析
源码:
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}void SelectSort(int* a, int n)
{
/*int min = 0;
int left = 0;while (left < n)
{
min = left;
for (int i = left+1; i < n; i++)
{
if (a[i] < a[min])
{
min = i;
}
}
Swap(&a[min], &a[left]);
left++;
}*/
int left = 0;
int right = n - 1;
while (left < right)
{
int max = left;
int min = left;
for (int i = left + 1; i < n-left; i++)
{
if (a[i] > a[max])
{
max = i;
}
if (a[i] < a[min])
{
min = i;
}
}Swap(&a[min], &a[left]);
if (left == max)
{
max = min;
}
Swap(&a[max], &a[right]);
left++;
right--;}
}
性能比较
直接选择排序的时间复杂度和直接插入排序的一样。
那么直接插入排序和直接选择排序,我们选择一个,用谁比较好。
答案是直接插入排序。
直接插入排序当遇到比较有序的数据时,时间复杂度为O(N)
但是直接选择排序遇到比较有序的数据时,仍然需要遍历寻找最小下标。时间复杂度还是O(N^2)
比如说,一组数据先利用希尔排序排好,然后比较直接插入排序与直接选择排序
显而易见,直接插入排序更好。