您的位置:首页 > 其它

排序算法(中)--堆排序、计数排序

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;
}

快速排序由于方法比较多,在下次会给大家分享。同时对所有的排序方法的稳定性,时间复杂度,空间复杂度进行分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐