排序算法(中)--堆排序、计数排序
2017-05-25 01:07
218 查看
堆排序:堆排序是利用建堆过程中的向下调整算法,进行排序。升序排列时,应建立大堆,每次选出最大的堆顶的数,然后将堆顶的数据与最末端的数据交换,然后减小堆的大小,进行再次调整。重复以上操作即可。降序排列时,应建立小堆,与上述过程相同。
大小堆:
向下调整算法:
我引用殷人昆老师数据结构里面的给大家看看思想。
堆排序的代码为:
void AjustDown(int* arr, int pos, int size) //向下调整算法堆排序
{
int parent = pos;
int child = 2 * pos + 1;
while (child <= size)
{
if (child<size && arr[child + 1] > arr[child])
{
child++;
}
if (arr[parent] < arr[child])
{
swap(arr[parent], arr[child]);
parent = child;
child = child * 2 + 1;
}
else
{
break;
}
}
}
void AjustDown(int* arr, int size)
{
int parent = (size - 2) / 2;
while (parent >= 0)
{
AjustDown(arr, parent, size-1);
parent--;
}
}
void HeapSort(int* arr, int size)//堆排序
{
AjustDown(arr,size);
while (size > 1)
{
int temp = arr[0];
arr[0]=arr[size - 1];
arr[size - 1] = temp;
size--;
AjustDown(arr,size);
}
}计数排序:
思想:就是通过创建带排序数组中Max与Min的差值大小的数组,来统计带排序数组中所出现数值的个数,进而最终还原排序后的数组。
方法:1、计算待排序数组中Max与Min并计算差值newsize;
2、开辟newsize大小的数组,以待排序数组数值-Nin为下标,对带排序数组的数值出现个数进行统计;
3、对带排序数组进行还原;
计数排序的代码实现:
void CountSort(int *arr, int size)
{
int Max = arr[0];
int Min = arr[0];
for (int i = 0; i < size; ++i)
{
if (Max < arr[i])
Max = arr[i];
if (Min > arr[i])
Min = arr[i];
}
int newsize = Max - Min + 1;
int* a = new int[newsize];
memset(a, 0, sizeof(int)*newsize);
for (int i = 0; i < size; ++i)
{
a[arr[i] - Min]++;
}
int j = 0;
for (int i = 0; i < newsize; ++i)
{
while (a[i])
{
arr[j++] = i+Min;
a[i]--;
}
}
delete[] a;
}
快速排序由于方法比较多,在下次会给大家分享。同时对所有的排序方法的稳定性,时间复杂度,空间复杂度进行分析。
大小堆:
向下调整算法:
我引用殷人昆老师数据结构里面的给大家看看思想。
堆排序的代码为:
void AjustDown(int* arr, int pos, int size) //向下调整算法堆排序
{
int parent = pos;
int child = 2 * pos + 1;
while (child <= size)
{
if (child<size && arr[child + 1] > arr[child])
{
child++;
}
if (arr[parent] < arr[child])
{
swap(arr[parent], arr[child]);
parent = child;
child = child * 2 + 1;
}
else
{
break;
}
}
}
void AjustDown(int* arr, int size)
{
int parent = (size - 2) / 2;
while (parent >= 0)
{
AjustDown(arr, parent, size-1);
parent--;
}
}
void HeapSort(int* arr, int size)//堆排序
{
AjustDown(arr,size);
while (size > 1)
{
int temp = arr[0];
arr[0]=arr[size - 1];
arr[size - 1] = temp;
size--;
AjustDown(arr,size);
}
}计数排序:
思想:就是通过创建带排序数组中Max与Min的差值大小的数组,来统计带排序数组中所出现数值的个数,进而最终还原排序后的数组。
方法:1、计算待排序数组中Max与Min并计算差值newsize;
2、开辟newsize大小的数组,以待排序数组数值-Nin为下标,对带排序数组的数值出现个数进行统计;
3、对带排序数组进行还原;
计数排序的代码实现:
void CountSort(int *arr, int size)
{
int Max = arr[0];
int Min = arr[0];
for (int i = 0; i < size; ++i)
{
if (Max < arr[i])
Max = arr[i];
if (Min > arr[i])
Min = arr[i];
}
int newsize = Max - Min + 1;
int* a = new int[newsize];
memset(a, 0, sizeof(int)*newsize);
for (int i = 0; i < size; ++i)
{
a[arr[i] - Min]++;
}
int j = 0;
for (int i = 0; i < newsize; ++i)
{
while (a[i])
{
arr[j++] = i+Min;
a[i]--;
}
}
delete[] a;
}
快速排序由于方法比较多,在下次会给大家分享。同时对所有的排序方法的稳定性,时间复杂度,空间复杂度进行分析。
相关文章推荐
- 排序算法(插入排序、shell排序、冒泡排序、选择排序、合并排序、堆排序、快速排序、计数排序、基数排序、桶排序)
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- 经典排序算法系列7----堆与堆排序
- 排序算法(三)-- 堆排序
- 排序算法之(7)——堆排序
- 排序算法总结之堆排序
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 排序算法系列----堆排序(C++)
- 【排序算法】:堆排序
- 数据结构和算法分析之排序算法--选择排序(堆排序)
- 排序算法三:堆排序基本原理以及Python实现
- 排序算法之 堆排序 及其时间复杂度和空间复杂度
- 一步一步解析java排序算法---堆排序(最大堆)
- 排序算法(3)—优先队列,堆排序
- 4-5 基础堆排序和Heapify(两个版本的基于堆的排序算法)
- 堆排序、中序排序算法实现
- 排序算法之堆排序(二)
- 常见排序算法汇总与分析(下)(基数排序与计数排序)
- 几种常见的排序算法,选择排序,冒泡排序,希尔排序,堆排序,快速排序,归并排序,基数排序的比较