目录
1.选择排序
1.1基本思想
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据排完
1.2算法描述
- 在元素集合
a[i]-a[n-1]
中选出元素最小(最大)
的数 - 若它不是这组元素中的
第一个(最后一个)
元素,则将它与这组元素中第一个(最后一个)
元素交换 - 在剩余的
a[i+1]-a[n-1](a[i]-a[n-2])
集合中,重复上述操作,直到集合剩余1个元素
c
// 选择排序
//时间复杂度:O(N^2)
void swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void SelectSort(int* a, int n)
{
for (int i = 0; i < n-1; i++)//排n-1序
{
int min = i;
for (int j = i + 1; j < n; j++)
{
if (a[j] < a[min])
{
min = j;
}
}
swap(&a[i], &a[min]);//把选出的最小的元素与待排序元素的第一个相交换
}
}
1.3优化
- 在元素集合a[0]-a[n-1]中找出最大和最小的元素,分别放在待排序元素的最后和第一个位置
- 在剩余的元素集合a[1]-a[n-2]中,重复上述操作,直到集合集合剩一个元素或者没有元素
c
void SelectSort1(int* a, int n)
{
int begin = 0;
int end = n - 1;
while (begin < end)
{
int max = begin;
int min = begin;
for (int i = begin + 1; i <= end; i++)
{
if (a[i] > a[max])
max = i;
if (a[min] > a[i])
min = i;
}
swap(&a[begin], &a[min]);
if (begin == max)
max = min;
swap(&a[end], &a[max]);
++begin;
--end;
}
}
2.冒泡排序
2.1算法描述
- 比较相邻的元素。如果第一个比第二个大,就交换;
- 对每一对相邻元素作同样的操作,从开始第一对到结尾的最后一对,这样在最后的元素就是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
c
// 冒泡排序
//时间复杂度:O(N^2)
void swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void BubbleSort(int* a, int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
swap(&a[j], &a[j + 1]);
}
}
}
}
2.2优化
如果数组中已经排好了序,就可以直接跳出循环
c
void BubbleSort(int* a, int n)
{
for (int i = 0; i < n - 1; i++)
{
int flag = 1;
for (int j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
flag = 0;
swap(&a[j], &a[j + 1]);
}
}
if (flag == 1)
break;
}
}