简单选择排序和冒泡排序
两种方法都是每一趟找出最大(小)的他放在一个位置,下一趟不用去管这个位置,只是两种方法采用的找的形式不一样
1. 简单选择排序:固定位置与前(后)面的比较
例子:5 1 6 2 假如按从小到大排序
5:粗体标记表示 固定的位置
5
:这种标记表示已经排好
5:这种标记表示需要和固定位置比较的
趟 | 需要排的 | 排序完后 |
---|---|---|
第一趟: | 5 7 4 2 | 5 7 4 2 |
5 7 4 2 | 4 7 5 2 | |
4 7 5 2 | 2 7 5 4 | |
第二趟: | 2 7 5 4 |
2 5 7 4 |
2 5 7 4 |
2 4 7 5 | |
第三趟: | 2 4 7 5 |
2 4 5 7 |
最后 | 2 4 5 7 |
7自动排好 |
void SimpleSelectSort(Rectype *R, int n)
{
int i, j;
for (i = 0; i <n; i++)
{
for (j = i + 1; j < n; j++)
{
if (R[j].Key > R[i].Key)
{
Swap(R, i, j);
}
}
}
}
2. 冒泡排序:相邻位置比较
例子:5 1 6 2 假如按从小到大排序
5
:这种标记表示已经排好
5 7:这种标记表示相邻位置比较
趟 | 需要排的 | 排序完后 |
---|---|---|
第一趟: | 5 7 4 2 | 5 7 2 4 |
5 7 2 4 | 5 2 7 4 | |
5 2 7 4 | 2 5 7 4 | |
第二趟: | 2 5 7 4 |
2 5 4 7 |
2 5 4 7 |
2 4 5 7 | |
第三趟: | 2 4 5 7 |
2 4 5 7 |
最后 | 2 4 5 7 |
7自动排好 |
void BubbleSort(Rectype *R, int n)
{
int i, j;
for (i = n; i > 0; i--)
{
for (j = 0; j < i; j++)
{
if (R[j].Key < R[j + 1].Key)
Swap(R, j, j + 1);
}
}
}