3.选择排序
思路:每一次找出最小和最大的数,分别放在左边和右边
void selectsort(int *a, int size)
{
int begin = 0;
int end = size - 1;
while (begin < end)
{
int max = begin;
int min = begin;
for (int i = begin + 1; i <= end; i++)
{
if (a[i] < a[min])//找出最小值的下标
{
min = i;
}
if (a[i] > a[max])//找出最大值的下标
{
max = i;
}
}
Swap(&a[begin], &a[min]);//最小值放到左边
if (begin == max)//如果最大值的下标为begin,由于上一步的Swap,最大值去到了下表为min的位置
{
max = min;
}
Swap(&a[end], &a[max]);//最小值放到右边
begin++;
end--;
}
}
例如对9,8,7,6,5,4,3,2,1进行选择排序
第一趟排序:1,8,7,6,5,4,3,2,9
第二趟排序:1,2,7,6,5,4,3,8,9
以此类推。。。。
下面对第一趟排序进行解释:
1:一开始max和min的下标均为数组头;经过一次for循环后,max的下标为0,min的下标为8;
2:接着把min下标对应的数放置begin下标的位置,此时数组为
1,8,7,6,5,4,3,2,9。(注意此时由于max的下标就在begin的位置,由于数值交换导致max对应的值放到了下标为min的位置,所以我们要添加一个判断:如果begin就是最大值的下标,那么由于上一步最小值的交换,所以此时最大值去到了下标为min的位置,因此把max的下标更正)
3:接着交换max位置与end位置的值
4:此时就为 :1,8,7,6,5,4,3,2,9
5:缩小排序范围,begin++,end–;
6:进行第二趟排序。。。。。。。。
选择排序的时间复杂度:O(N^2)
(在任何情况下都O(N^2))
4.冒泡排序
void bubblesort(int *a, int size)
{
int exchange = 0;
for (int j = 0; j < size; j++)//一共走size 躺,(size为数组的元素个数)
{
for (int i = 1; i < size - j; i++)//每一趟前后两个数比较,把大的数往后放
{
if (a[i - 1] > a[i])
{
exchange = 1;//用于判断原来的数组是否已经有序
Swap(&a[i - 1], &a[i]);
}
}
if (exchange == 0)//原来的的数组就已经有序
{
break;
}
}
}
例如 9,8,7,6,5,4,3,2,1
每一趟排序通过前后两个数之间的比较,把最大的数排到最后面。以此类推。。。
其中exchange是用来判断未排序前数组是否已近有序。
时间复杂度:O(N^2)
最好的情况:O(N)