常用排序算法的时间复杂度和空间复杂度表格
1.选择排序
思想:每次找一个最小值。
#include <iostream>
using namespace std;
//从小到大排序
void SelectSort(int a[], int n)
{
int index, temp;
for (int i = 0; i < n - 1; i++) //执行(n-1) 次
{
index = i;
for (int j = i + 1; j<n; j++)//执行(n-1)次 每个a[i]都要与a[i+1]至a[n-1]做比较
{
if (a[index] > a[j]) //记录序列中最小值的位置
{
index = j;
}
}
if (index != i) //如果无序序列中第一个记录不是最小值,则进行交换
{
temp = a[index];
a[index] = a[i];
a[i] = temp;
}
}
}
int main()
{
int a[10], i, n = 10, num = 10;
for (i = 0; i < n; i++)
a[i] = num--;
cout << "原序列:\n";
for (i = 0; i < n; i++)
cout << a[i] << " ";
SelectSort(a, n); cout << "排序后:\n"; for (i = 0; i < n; i++)cout << a[i] << " ";
return 0;
}
//优化排序
//如果在每一次查找最小值的时候,也可以找到一个最大值,然后将两者分别放在它们应该出现的位置,这样遍历的次数就比较少了,下边
//给出代码实现:
void SelectSort2(int a[], int n)
{
int left = 0; int right = n - 1; int min = left;//存储最小值的下标
int max = left;//存储最大值的下标
while (left <= right)
{
min = left;
max = left;
for (int i = left; i <= right; ++i)
{
if (a[i] < a[min])
min = i;
if (a[i] > a[max])
if (a[i] > a[max])
max = i;
}
swap(a[left], a[min]);
if (left == max)
max = min;
swap(a[right], a[max]);
++left;
--right;
}
}
//递归版
void RecursiveSelectSort(int a[], int start, int end)
{
if (start < end)
{
int temp = a[start];
int index = start;
for (int i = start + 1; i < end; i++)
{
if (a[index] > a[i])
{
index = i;
}
}
if (start != index)
{
temp = a[start];
a[start] = a[index];
a[index] = temp;
}
start++;
RecursiveSelectSort(a, start, end);
}
}
max = i;
}
swap(a[left], a[min]);
if (left == max)
max = min;
swap(a[right], a[max]);
++left;
--right;
}
}
//递归版
void RecursiveSelectSort(int a[], int start, int end)
{
if (start < end)
{
int temp = a[start];
int index = start;
for (int i = start + 1; i < end; i++)
{
if (a[index] > a[i])
{
index = i;
}
}
if (start != index)
{
temp = a[start];
a[start] = a[index];
a[index] = temp;
}
start++;
RecursiveSelectSort(a, start, end);
}
}
2.堆排序
思想:一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,
二是反复调用渗透函数实现排序的函数。