堆排序与冒泡排序的比较

来源:互联网 发布:数据采集器的工作原理 编辑:程序博客网 时间:2024/06/01 09:09

堆排序的过程是首先建立小顶堆(或者大顶堆),这个堆的特征是根节点不大于(或者不小于)任何子节点。建立之后就可以通过每次取出堆中的第一个元素(这个堆的最小值或最大值)然后将新的堆调整从而下次再取第一个这种循环操作来得到一个有序的序列。

在建立堆的过程中都是从最后一个根节点开始,因为纯叶子节点不用处理,它已经是小顶堆了(因为没有子节点所以也满足特征),处理完一个根节点,就接着处理上一个一直到第一个元素。

堆的调整过程是首先把最后一个元素放到第一个元素位置处(因为第一个我们已经取出来了),之后从第一个元素开始“下沉”,下沉的意义是把大的数往下移这样处理完一遍之后首元素又是这个堆中的最小值了,我们再取出来。

我比较了堆排序与冒泡排序的性能,打印了时间戳。在数据量比较大的时候确实差的很多,一个O(N*logN)一个O(N*N)嘛。

具体code如下所示:

#include <stdlib.h>#include <time.h>#include <string.h>#include <stdio.h>void heap_down(unsigned int* a, int i, int n){unsigned int tmp = a[i];int j = (i << 1) + 2;if ((j - 1) >= n)return;if (j < n){if (a[j - 1] < a[j])--j;}else--j;if (a[i] > a[j]){tmp = a[j];a[j] = a[i];a[i] = tmp;i = j;heap_down(a, i, n);}elsereturn;}void create_heap(unsigned int* a, int n){for (int i = n / 2 - 1; i >= 0; --i)heap_down(a, i, n);}void heap_sort(unsigned int* a, int n){create_heap(a, n);//建立小顶堆if (n == 1)return;for (int i = n; i != 0; --i){unsigned int tmp = a[0];a[0] = a[i - 1];a[i - 1] = tmp;heap_down(a, 0, i - 1);//“下沉”操作}}void bubble_sort(unsigned int *num, int n){int i, j;for (i = 0; i < n; i++){for (j = 0; i + j < n - 1; j++){if (num[j] > num[j + 1]){unsigned int temp = num[j];num[j] = num[j + 1];num[j + 1] = temp;}}}return;}int main(int argc, char* argv[]){int k = 10000000;unsigned int* p = new unsigned int[k];memset(p, 0, k * sizeof(int));unsigned int* p1 = new unsigned int[k];memset(p1, 0, k * sizeof(int));for (int j=0;j!=k;++j)p[j] = rand();memcpy(p1, p, k * sizeof(int));clock_t start, finish;double  duration1,duration2;start = clock();heap_sort(p, k);finish = clock();duration1 = (double)(finish - start) / CLOCKS_PER_SEC;start = clock();bubble_sort(p1, k);finish = clock();duration2 = (double)(finish - start) / CLOCKS_PER_SEC;FILE* f1;FILE* f2;fopen_s(&f1,"heap.txt", "w+");fopen_s(&f2,"bubble.txt", "w+");fprintf(f1, "%d numbers sort total run time: %f\n", k, duration1);fprintf(f2, "%d numbers sort total run time: %f\n", k, duration2);for (int i = 0; i != k; ++i){fprintf(f1, "%d\n", p[i]);fprintf(f2, "%d\n", p1[k-1-i]);}fclose(f1);fclose(f2);delete[] p;delete[] p1;return 0;}



阅读全文
0 0
原创粉丝点击