一、折半插入排序(Binary Sort)
1.1 算法思路
1.2 算法描述
1.3 算法实现
#include<iostream>
using namespace std;
typedef int KeyType;
struct ElemType
{
KeyType key;
int exist;
};
struct SeqList
{
ElemType *elem;
int length;
};
void BinarySort(SeqList &L)
{
int a, b, m;
ElemType x;
for(int i = 1; i < L.length; i++)
{
x = L.elem[i];
a = 0;
b = i-1;
while(a <= b)
{
m = (a+b)/2;
if(L.elem[m].key > x.key)
b = m-1;
else
a = m+1;
}
for(int j = i-1; j > b; j--)
{
L.elem[j+1].key = L.elem[j].key;
}
L.elem[b+1].key = x.key;
}
}
int main()
{
ElemType test[] = { {4},{6},{2},{7},{5},{1},{3},{8} };
SeqList L;
L.elem = test;
L.length = 8;
BinarySort(L);
for (int i = 0; i < L.length; i++)
{
cout << L.elem[i].key << endl;
}
return 0;
}
1.4 算法复杂度分析
时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度为
O
(
1
)
O(1)
O(1)
1.5 相关练习题
二、冒泡排序(Bubble Sort)
2.1 算法思路
2.2 算法描述
2.3 算法实现
#include<iostream>
using namespace std;
typedef int KeyType;
struct ElemType
{
KeyType key;
int exist;
};
struct SeqList
{
ElemType *elem;
int length;
};
void BubbleSort_v1(SeqList &L)
{
ElemType x;
for(int i = 0; i < L.length; i++)
{
for(int j = 0; j < L.length - i; j++)
{
if(L.elem[j].key > L.elem[j+1].key)
{
x.key = L.elem[j+1].key;
L.elem[j+1].key = L.elem[j].key;
L.elem[j].key = x.key;
}
}
}
}
void BubbleSort_v2(SeqList &L)
{
ElemType x;
bool change;
int i, j;
for(i = 0; i < L.length; i++)
{
for(change = false, j = 0; j < L.length-i; j++)
{
if(L.elem[j].key > L.elem[j+1].key)
{
x.key = L.elem[j+1].key;
L.elem[j+1].key = L.elem[j].key;
L.elem[j].key = x.key;
change = true;
}
}
if(!change) // 针对有序序列,无需排序时,增加change变量可以使其在一趟排序完成判断
break;
}
}
int main()
{
ElemType a[] = { {4},{6},{2},{7},{5},{14},{1},{3},{8},{15},{10},{13},{9},{12},{11} };
SeqList L;
L.elem = a;
L.length = 15;
BubbleSort_v1(L);
// BubbleSort_v2(L);
for (int i = 0; i < L.length; i++)
{
cout << L.elem[i].key << endl;
}
return 0;
}
2.4 算法复杂度分析
时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度为
O
(
1
)
O(1)
O(1)
2.5 相关练习题
三、简单选择排序(Simple Selection Sort)
3.1 算法思路
3.2 算法描述
3.3 算法实现
#include<iostream>
using namespace std;
typedef int KeyType;
struct ElemType
{
KeyType key;
int exist;
};
struct SeqList
{
ElemType *elem;
int length;
};
void SelectSort(SeqList &L)
{
ElemType x;
for(int i = 0; i < L.length-1; i++)
{
int k = i;
for(int j = i+1; j < L.length; j++)
{
if(L.elem[j].key < L.elem[k].key)
k = j;
}
if (k > i)
{
x.key = L.elem[i].key;
L.elem[i].key = L.elem[k].key;
L.elem[k].key = x.key;
}
}
}
int main()
{
ElemType a[] = { {4},{6},{2},{7},{5},{14},{1},{3},{8},{15},{10},{13},{9},{12},{11} };
SeqList L;
L.elem = a;
L.length = 15;
SelectSort(L);
for (int i = 0; i < L.length; i++)
{
cout << L.elem[i].key << endl;
}
return 0;
}
3.4 算法复杂度分析
时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度为
O
(
1
)
O(1)
O(1)
3.5 相关练习题