时间复杂度、空间复杂度
排序算法的分析与实现
- 冒泡排序
分析:第 i 趟遍历可以将序列中的第 i 个最大值找到,放到倒数第 i 个位置; 从第一个位置开始,一趟遍历找最大值,需要每次与后一个相邻位置比较,将较大值后移;
template <typename T>
void BubbleSort(T a[], int len)
{
int i, j;
T temp;
for (j = 0; j < len - 1; j++)
{
for (i = 0; i < len - 1 - j; i++)
if (a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
- 插入排序
分析:将第 i 个数在前面已经排好序的 i-1 个数中找合适的位置插入; 将数后移而不是交换,省去辅助变量节约了时间;
template <typename T>
void InsertSort(T arr[], int len)
{
if (arr == NULL || len <= 0)
{
return;
}
T value;
for (int i = 1; i < len; i++)
{
value = arr[i];
for (int j = i - 1; j >= 0; j--)
{
if (value < arr[j])
{
arr[j + 1] = arr[j];
arr[j] = value;
}
else
{
break;
}
}
}
}
- 选择排序
分析:第 1 趟选择第1小数,然后与第一个位置的数交换; …; 第 i 趟选择第i小数,然后与第 i 个位置的数交换;
template<typename T>
void SelectionSort(T arr[],int n)
{
int index;
for (int i = 0; i < 10; ++i)
{
index = i;
for (int j = i + 1; j < 10; j++)
{
if (arr[index] > arr[j])
{
index = j;
}
}
T value = arr[index];
arr[index] = arr[i];
arr[i] = value;
}
}
- 快速排序
分析:选取序列第一个值作为key,则第一个位置空缺; 从后往前找第一个小于key的值,放在空缺位置,则第一个小于key的值位置空缺; 从前往后找第一个大于key的值,放在空缺位置,则第一个大于key的值位置空缺; 将key填入最后的空缺位置; 一趟比较后,key的左边均小于key,右边均大于key; 对key的左边序列、右边序列进行同样的操作。
template <typename T>
void quickSort(T a[], int begin, int end)
{
if (begin < end)
{
T key = a[begin];
int left = begin, right = end;
while (left < right)
{
while (a[right] > key && left < right)
right--;
if (left < right)
{
a[left] = a[right];
left++;
}
while (a[left] < key && left < right)
left++;
if (left < right)
{
a[right] = a[left];
right--;
}
}
a[right] = key;
Sort(a, 0, left - 1);
Sort(a, left + 1, end);
}
}
- 归并排序
分析: 将待排序列分成左右两部分; 此时左右两部分均有序;(若左右都只有一个数,则为有序数列) 将有序的左右两部分归并;
void merge(int a[], int begin, int mid, int end, int tmp[])
{
int i = begin, j = mid + 1;
int index = 0;
while (i <= mid && j <= end)
{
if (a[i] < a[j])
{
tmp[index++] = a[i++];
}
else
{
tmp[index++] = a[j++];
}
}
while (i <= mid)
{
tmp[index++] = a[i++];
}
while (j <= end)
{
tmp[index++] = a[j++];
}
for (int i = 0; i < index; i++)
{
a[begin++] = tmp[i];
}
}
List item
void mergeSort(int a[], int begin, int end, int tmp[])
{
if (begin < end)
{
int mid = (begin + end) / 2;
mergeSort(a, begin, mid, tmp);
mergeSort(a, mid + 1, end, tmp);
merge(a, begin, mid, end, tmp);
}
}
- 希尔排序
分析:
|