一、排序算法的概述
排序算法种类:
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
算法复杂度:
二、冒泡排序
1.步骤
- 前提条件:假设数组长度为n,目标为升序。
- 步骤:
1)遍历数组中的元素,如果arry[Index + 1] < arry[nIndex],则交换arry[Index + 1]和arry[nIndex]中的内容。
2)对数组进行n次遍历直至所有数据有序。
2.C++实现
void BubbleSort(in arry[], int nSize)
{
for (int nIndex = 1; nIndex < nSize; ++nIndex)
{
for(int nTmpIndex = 0; nTmpIndex < nSize; ++nIndex)
{
if (arry[nTmpIndex] > arry[nIndex])
{
int nVal = arry[nTmpIndex];
arry[nTmpIndex] = arry[nIndex];
arry[nIndex] = nVal;
}
}
}
}
三、选择排序
1.步骤
- 前提条件:假设数组长度为n,目标为升序。
- 步骤:
1)遍历数组中所有元素,将最小的元素插入到无序队列的第一个元素前,形成有序队列。
2)继续遍历其他无序队列,执行步骤1)
2.C++实现
void SelectionSort(int arry[], int nSize)
{
for (int nIndex = 0; nIndex < nSize; ++nIndex)
{
int nMinValIndex = nIndex;
for (int nTmpIndex = nIndex; nTmpIndex < nSize; ++nTmpIndex)
{
if (arry[nTmpIndex] < arry[nMinValIndex])
{
nMinValIndex = nTmpIndex;
}
}
int nMinVal = arry[nMinValIndex];
arry[nMinValIndex] = arry[nIndex];
arry[nIndex] = nMinVal;
}
}
四、插入排序
遍历数组的元素,与前面已经进行过排序的数组进行比对并插入到合适的位置。类似于我们玩扑克牌一样,抓一张牌并按序插入到合适位置
1.步骤
- 前提条件:假设数组长度为n,目标为升序。
- 步骤:
1)依次遍历数组中的元素,元素的索引为nIndex,向前查找
2)如果存在位置N使得arry[N]小于该元素并且arry[N+1]大于该元素则将该元素插入到N+1的位置。原N+1至nIndex - 1的元素后移一个位置。
2.C++实现
void InsertSort(int arry[], int nSize)
{
for (int nIndex = 1; nIndex < nSize; ++nIndex)
{
int nInsertIndex = nIndex - 1;
for (; nInsertIndex >= 0; --nInsertIndex)
{
if (arry[nInsertIndex] < arry[nIndex])
{
break;
}
}
int nInsertValue = arry[nIndex];
for (int nTmpIndex = nIndex; nTmpIndex > nInsertIndex + 1; --nTmpIndex)
{
arry[nTmpIndex] = arry[nTmpIndex - 1];
}
arry[nInsertIndex + 1] = nInsertValue;
}
}