数据结构如下:
#include <iostream>
using namespace std;
#define MAXSIZE 1000
typedef struct {
int Data[MAXSIZE+1];
int length;
} SqList;
void swap(SqList *List, int a, int b) {
int tmp = List->Data[a];
List->Data[a] = List->Data[b];
List->Data[b] = tmp;
}
冒泡排序(Bubble Sort)
冒泡排序是最简单的排序,可以理解为序列就像气泡一样,把最小(最大)的树,放置在最前面
举个栗子(其实是三个)
[注] 在最后一个冒泡排序中,加入了一个Bool 的判断,在任意一次排序中,遍历完成所有的为进行排序的子序列,然后没有找到需要交换的数值,说明,该序列已经是合乎顺序了,可以退出
//找到最小的,冒泡到最前面
void BubbleSort1(SqList *List)
{
int i, j;
for (i = 1; i < List->length; i++)
{
for (j = i+1; j <= List->length; j++)
{
if (List->Data[i] > List->Data[j])
swap(List, i, j);
}
}
}
//普通冒泡排序
void BubbleSort2(SqList *List)
{
int i, j;
for (i = 1; i < List->length; i++)
{
for (j = List->length - 1; j > i; j--)
{
if (List->Data[j] > List->Data[j + 1])
{
swap(List, j, j + 1);
}
}
}
}
void BubbleSort3(SqList * List) {
int i, j;
bool isFinish = true;
for (i = 1; i < List->length&&isFinish; i++)
{
isFinish = false;
for (j = List->length - 1; j > i; j--)
{
if (List->Data[j] > List->Data[j + 1]) {//只有经历了交换,才能继续进行
swap(List, j, j + 1);
isFinish = true;
}
}
}
}
冒泡排序的时间复杂度
∑ni=2(i−1)=1+2+3+....+(n−1)=(n2−n)2
∑
i
=
2
n
(
i
−
1
)
=
1
+
2
+
3
+
.
.
.
.
+
(
n
−
1
)
=
(
n
2
−
n
)
2
所以冒泡排序的事件复杂度:O(
n2
n
2
)
简单选择排序(Simple selection Sort)
简单选择排序: 找到最小当前未排序的子数列中的最小值,放置在数列最前端
举个栗子
void SelectSort(SqList * List)
{
int i, j, min;
for (i = 1; i < List->length; i++)//我需要在i的位置放置最小的数字
{
min = i;//将最前面的假设为最小
for (j = i + 1; j <= List->length; j++)
{
if (List->Data[min] > List->Data[j])//找到当前未排序数列中最小的位置
{
min = j;
}
}
if (i != min)//将最小值放置在数列中
swap(List, i, min);
}
}
简单选择排序的时间复杂度
∑n−1i=1(n−i)=n−1+n−2+....1=n2−n2
∑
i
=
1
n
−
1
(
n
−
i
)
=
n
−
1
+
n
−
2
+
.
.
.
.1
=
n
2
−
n
2
时间复杂度:O(
n2
n
2
)
直接插入排序(Straight Insertion Sort)
就行扑克牌,根据”分而治之”的思想,在未排序的序列中,找到第一个数字,然后插入到有序的数列中;
举个栗子
void InsertSort(SqList *List)
{
int i, j;
for (int i = 2; i <= List->length; i++)
{
if (List->Data[i] < List->Data[i - 1])//判断是否需要插入
{
List->Data[0] = List->Data[i];//设置哨兵
for (j = i - 1; List->Data[j] > List->Data[0]; j--)
List->Data[j + 1] = List->Data[j];//后移
List->Data[j + 1] = List->Data[0];//最后放在正确位置
}
}
}
简单选择排序的时间复杂度
∑ni=2(i)=2+3+4...+n=(n+2)∗(n−1)2
∑
i
=
2
n
(
i
)
=
2
+
3
+
4...
+
n
=
(
n
+
2
)
∗
(
n
−
1
)
2
时间复杂度:O(
n2
n
2
)