自己实现堆排序
2014-01-11 15:30
239 查看
insert( 插入 )
delete( 删除 )
sort( 堆排序 )
从上面我们看到一个数组每次通过一次删除,就是把堆顶的元素和最后一位数交换,之后进行调整,使堆继续为最小堆
那么如此形成的新的堆仍然是最小堆。
#include <stdio.h> #include <stdlib.h> //插入节点上浮过程 NodeUp( int arr[], int i ) { int j, temp; temp = arr[i]; j = ( i - 1 ) / 2; while ( j >= 0 && i != 0 ) { if ( temp >= arr[j] ) { break; } arr[i] = arr[j]; i = j; j = ( i - 1 ) / 2; } arr[i] = temp; } //打印函数 void print(int arr[]) { int i = 0; printf( "排序后的数组:\n" ); for ( ; i < 8; ++i ) { printf("%d\n", arr[i]); } } //在最小堆中插入节点 void MinHeapInsert(int a[], int n, int nInt) { a = nInt; NodeUp(a, n); } //=====================主函数======================= int main() { int a[] = { 1,2,3,5,9,4,10 }; MinHeapInsert(a, 7, 3);//排序后的数组:1,2,3,3,9,4,10,5 print(a); return 0; }
delete( 删除 )
#include <stdio.h> #include <stdlib.h> //从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2 //下调函数 void NodeDown(int a[], int i, int n) { int j, temp; temp = a[i]; j = 2*i + 1; while ( j < n ) { if ( j+1 < n && a[j+1] < a[j] ) { j = j+1; } if ( a[j] < temp ) { a[i] = a[j]; i = j; j = 2*i + 1; } } a[i] = temp; } //交换函数 void swap(int *a, int *b) { if (*a != *b) { *a ^= *b; *b ^= *a; *a ^= *b; } } /* * (1) 原堆的样子 新堆的样子 * 1 10 * / \ 把最后一位放置堆顶 / \ * 2 3 =================> 2 3 * / \ / \ / \ / \ * 5 9 4 10 5 9 4 1(其实就是把1放到数组最后一位,这个数组编程10,2,3,5,9,4,1) * * (2) 之后执行NodeDown函数第一步交换10和2,3之间小的那个数 * 2 * / \ * 10 3 * / \ / \ * 5 9 4 1 * * (3) 之后交换10和5,9之间小的那个数 * 2 * / \ * 5 3 * / \ / \ * 10 9 4 1 *===================>现在就变成了最终的结果:2,5,3,10,9,4,1 * */ void MinHeapDelete(int arr[], int n) { swap(&arr[0], &arr[n - 1]); NodeDown(arr, 0, n - 1); } //打印函数 void print(int arr[], int n) { int i = 0; printf( "排序后的数组:\n" ); for ( ; i < n; ++i ) { printf("%d\n", arr[i]); } } //=====================主函数======================= int main() { int a[] = { 1,2,3,5,9,4,10 }; MinHeapDelete(a, 7);//排序后的数组:2,5,3,10,9,4, 1(1 是被删除的,其实它被换到最后一位了,这里也print出来) print(a, 7); return 0; }
sort( 堆排序 )
从上面我们看到一个数组每次通过一次删除,就是把堆顶的元素和最后一位数交换,之后进行调整,使堆继续为最小堆
那么如此形成的新的堆仍然是最小堆。
void MinHeapSort(int arr[], int n) { int i = n - 1; for (; i >= 1; --i) { swap(&arr[0], &arr[i]); NodeDown(arr, 0, i); } }
相关文章推荐
- 记录一下自己实现的堆排序
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- [GNU/Linux] 自己实现shell
- c++:自己动手实现线程安全的c++单例类
- python实现堆排序
- python 中自己写方法 计算向量长度 / 实现向量归一化
- 自己实现快捷方式文件的创建
- 自己写PHP扩展之实现类的继承
- 自己利用jQuery实现的win8图标浮动更新
- mvc5 解析route源码实现自己的route系统
- 自己实现简单的天气预报应用(9)
- 实现自己的ASP.NET宿主系统
- C#基础系列:开发自己的窗体设计器(实现控件的拖动)
- 数组实现堆排序(c++)
- 安卓开发-自己实现CursorAdapter将数据的数据装载到ListView
- 自己动手实现一个简单的string类(一)
- 自己动手写ORM框架(六):实现查询功能FindById方法
- 自己动手写ORM框架(八):实现修改功能Update方法
- 记得去实现自己的梦想,dream is power