二、选择排序
(1)主要思想
(2)代码实现
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
void SelectSort(int arr[], int len)
{
int minindex; //记录最小数的下标
int tmp = 0;
for (int i = 0; i < len; i++)
{
int minindex = i;
for (int j = i; j < len; j++)//找最小值
{
if (arr[minindex] > arr[j])
{
minindex = j;
}
}
tmp=arr[minindex];//交换数据
arr[minindex] = arr[i];
arr[i] = tmp;
}
}
void Show(int arr[], int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
//测试数据;
int main()
{
int arr[] = { 34,68,4,56,17,4,34,900,64,22,54,68,80,100 };
int len = sizeof(arr) / sizeof(arr[0]);
SelectSort(arr, len);
Show(arr, len);
}
运行结果:
(3)性能分析
- 时间复杂度:O(n^2).
- 空间复杂度:O(1)
- 稳定性:不稳定。
二、堆排序
堆分为两种:大根堆和小根堆。
(1)主要思想
(2)代码实现
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
static void HeapAdjust(int arr[], int start, int end)//调整成大根堆的函数
{
int tmp = arr[start];
int i;
for (i = 2 * start + 1; i <= end; i = 2 * i + 1)
{
if (i < end && arr[i] < arr[i + 1])//判断其有孩子,并且如果右孩子比左孩子大,将i的下标指向右孩子;
{
i++;
}
//if语句之后已经找到左右孩子的最大值;再将最大值和tmp相比,将大的调至根节点;
if (tmp < arr[i])
{
arr[start] = arr[i];
start = i;
}
else
{
break;
}
}
arr[start] = tmp;
}
void HeapSort(int arr[], int len)
{
assert(arr != NULL);
//调整为大根堆
int i;
for (i = (len - 1 - 1) / 2; i >= 0; i--)
{
HeapAdjust(arr, i, len - 1);
}
//出了循环已经是大根堆了;现将根和未排序的最后一个数交换;
for (i = 0; i < len - 1; i++)
{
int tmp = arr[0];
arr[0] = arr[len - 1 - i];
arr[len - 1 - i] = tmp;
//交换完成之后,在进行调整;
HeapAdjust(arr, 0, (len - 1 - i) - 1);
}
}
void Show(int arr[], int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
//测试程序
int main()
{
int arr[] = { 34,68,4,56,17,4,34,900,64,22,54,68,80,100 };
int len = sizeof(arr) / sizeof(arr[0]);
HeapSort(arr, len);
Show(arr, len);
}
运行结果:
(3)性能分析
- 时间复杂度:O(nlogn).
- 空间复杂度:O(1)
- 稳定性:不稳定。