亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? myheapalg.c

?? 提供了rbtree ttree avltree list hashtable等常用容器的算法,代碼經過uclinux + arm44b0平臺驗證
?? C
字號:
/**
 *
 * @file MyHeapAlg.c 堆相關的算法
 *
 * @author lin shao chuan (email:lsccsl@tom.com, msn:lsccsl@163.net)
 *
 */
#include "MyAlgorithm.h"

#include <assert.h>
#include <stdlib.h>

#include "__def_fun_def.h"
#include "mymempool.h"
#include "myutility.h"


/**
 * @brief 計算第二個子節點的坐標
 *
 * 0 - 1 2  2(i + 1) - 1 2(i + 1)
 * 1 - 3 4
 * 2 - 5 6
 */
#define HEAP_SECOND_CHILD_INDEX(x) (2 * ((x) + 1))

/**
 * @brief 計算父節點的坐標
 */
#define HEAP_PARENT_INDEX(x) (assert(x), ((x) - 1)/2)


static __INLINE__ int heap_push(void * buf, size_t step_size,
					 size_t hole_index, size_t top_index, const void * value, size_t value_size,
					 ALG_COMPARE compare, ALG_COPY copier,
					 const void * context)
{
	size_t parent = 0;

	assert(buf && value && compare && copier);
	assert(value_size <= step_size);

	/*
	* 自下(hole_index)而上(top_index)尋找value合適的放入位置
	*/
	while(hole_index > top_index)
	{
		parent = HEAP_PARENT_INDEX(hole_index);

		/*
		* value大于parent,則把parent拉到hole_index的位置
		*/
		if(compare(value, GET_INDEX_PTR(buf, parent, step_size), context) > 0)
		{
			copier(GET_INDEX_PTR(buf, hole_index, step_size), GET_INDEX_PTR(buf, parent, step_size), step_size, context);

			hole_index = parent;
		}
		else /* 否則退出循環 */
			break;
	}

	copier(GET_INDEX_PTR(buf, hole_index, step_size), value, (step_size < value_size) ? step_size : value_size, context);

	return 0;
}

static __INLINE__ int adjust_heap(void * buf, size_t len, size_t step_size, 
					   size_t hole_index, const void * value, size_t value_size,
					   ALG_COMPARE compare, ALG_COPY copier,
					   const void * context)
{
	size_t top_index = hole_index;
	size_t second_index = HEAP_SECOND_CHILD_INDEX(hole_index);

	assert(buf && value && compare && copier);

	/*
	* 自上(hole_index)而下地調整堆
	*/
	while(second_index < len)
	{
		/*
		* 取出小的一個節點往上拉
		*/
		if(compare(GET_INDEX_PTR(buf, second_index - 1, step_size), GET_INDEX_PTR(buf, second_index, step_size), context) > 0)
			second_index --;

		/*
		* 將second_index里的數據拷到hole_index里
		*/
		copier(GET_INDEX_PTR(buf, hole_index, step_size), GET_INDEX_PTR(buf, second_index, step_size), step_size, context);

		hole_index = second_index;
		second_index = HEAP_SECOND_CHILD_INDEX(hole_index);
	}

	/*
	* 處理只有左孩子,沒有右孩子的邊界情況
	*/
	if(second_index == len)
	{
		/*
		* 直接將左孩子往上拉
		*/
		copier(GET_INDEX_PTR(buf, hole_index, step_size), GET_INDEX_PTR(buf, second_index - 1, step_size), step_size, context);

		hole_index = second_index - 1;
	}

	heap_push(buf, step_size, hole_index, top_index, value, value_size, compare, copier, context);

	return 0;
}

static __INLINE__ int heap_pop(void * buf, size_t len, size_t step_size,					
					ALG_COMPARE compare, ALG_COPY copier,
					const void * context, void * swap_buf, const size_t swap_buf_size)
{
	assert(buf && compare && copier && swap_buf && swap_buf_size >= step_size);

	copier(swap_buf, GET_INDEX_PTR(buf, len - 1, step_size), step_size, context);
	copier(GET_INDEX_PTR(buf, len - 1, step_size), GET_INDEX_PTR(buf, 0, step_size), step_size, context);

	adjust_heap(buf, len - 1, step_size, 0, swap_buf, swap_buf_size, compare, copier, context);

	return 0;
}

static __INLINE__ int __make_heap__(void * buf, size_t len, size_t step_size,
					  ALG_COMPARE compare, ALG_COPY copier,
					  const void * context, void * swap_buf, const size_t swap_buf_size)
{
	size_t parent = HEAP_PARENT_INDEX((len - 1));

	assert(buf && compare && copier);
	assert(swap_buf && swap_buf_size >= step_size && len >= 2);

	while(1)
	{
		copier(swap_buf, GET_INDEX_PTR(buf, parent, step_size), step_size, context);
		adjust_heap(buf, len, step_size, parent, swap_buf, swap_buf_size, compare, copier, context);
		if(0 == parent)
			return 0;
		parent --;
	}
}


/**
 *
 * @brief 將一個堆排序
 *
 * @param buf:要排序的數據緩沖區起始地址
 * @param len:要排序的數組中元素的個數
 * @param step_size:指針下走的跨度(1表示一字節)
 * @param compare:比較回調函數(不可為空)
 * @param copier:拷貝回調函數(可為空)
 * @param context:用戶自定義的上下文數據(可為空)
 * @param swap_buf:生成堆過程中用到的臨時空間(可為null)
 * @param swap_buf_size:swap_buf的大小
 *
 */
int MyAlgHeapSort(void * buf, size_t len, size_t step_size,
				  ALG_COMPARE compare, ALG_COPY copier,
				  const void * context, void * swap_buf, size_t swap_buf_size)
{
	int need_free_swap = 0;
	if(NULL == buf || NULL == compare)
		return -1;

	if(NULL == copier)
		copier = __def_alg_copy_;

	if(NULL == swap_buf || swap_buf_size < step_size)
	{
		swap_buf = MyMemPoolMalloc(NULL, step_size);
		swap_buf_size = step_size;

		need_free_swap = 1;
	}

	/*
	* 依次pop即完成了排序
	*/
	while(len >= 2)
	{
		heap_pop(buf, len --, step_size, compare, copier, context, swap_buf, swap_buf_size);
	}

	if(need_free_swap)
		MyMemPoolFree(NULL, swap_buf);

	return 0;
}

/**
 *
 * @brief 生成堆
 *
 * @param buf:要排序的數據緩沖區起始地址
 * @param len:要排序的數組中元素的個數
 * @param step_size:指針下走的跨度(1表示一字節)
 * @param compare:比較回調函數
 * @param copier:拷貝回調函數
 * @param context:用戶自定義的上下文數據
 * @param swap_buf:生成堆過程中用到的臨時空間(可為null)
 * @param swap_buf_size:swap_buf的大小
 *
 */
int MyAlgMakeHeap(void * buf, size_t len, size_t step_size,
						 ALG_COMPARE compare, ALG_COPY copier,
						 const void * context, void * swap_buf, size_t swap_buf_size)
{
	if(NULL == buf || NULL == compare)
		return -1;

	if(len <= 1)
		return 0;

	if(NULL == copier)
		copier = __def_alg_copy_;

	if(swap_buf && swap_buf_size >= step_size)
	{
		__make_heap__(buf, len, step_size, compare, copier, context, swap_buf, swap_buf_size);

		return 0;
	}

	swap_buf = MyMemPoolMalloc(NULL, step_size);
	swap_buf_size = step_size;

	__make_heap__(buf, len, step_size, compare, copier, context, swap_buf, swap_buf_size);

	MyMemPoolFree(NULL, swap_buf);

	return 0;
}

/**
 *
 * @brief 堆排序
 *
 * @param buf:要排序的數據緩沖區起始地址
 * @param len:要排序的數組中元素的個數
 * @param step_size:指針下走的跨度(1表示一字節)
 * @param compare:比較回調函數
 * @param copier:拷貝回調函數
 * @param context:用戶自定義的上下文數據
 * @param swap_buf:生成堆過程中用到的臨時空間(可為null)
 * @param swap_buf_size:swap_buf的大小
 *
 */
int MyAlgHeapMakeAndSort(void * buf, size_t len, size_t step_size,
						 ALG_COMPARE compare, ALG_COPY copier,
						 const void * context, void * swap_buf, size_t swap_buf_size)
{
	MyAlgMakeHeap(buf, len, step_size, compare, copier, context, swap_buf, swap_buf_size);
	MyAlgHeapSort(buf, len, step_size, compare, copier, context, swap_buf, swap_buf_size);

	return 0;
}

/**
 *
 * @brief 從堆中彈出一個元素
 *
 * @param buf:要排序的數據緩沖區起始地址
 * @param len:數組中元素的個數
 * @param step_size:指針下走的跨度(1表示一字節)
 * @param compare:比較回調函數
 * @param copier:拷貝回調函數
 * @param context:用戶自定義的上下文數據
 * @param swap_buf:生成堆過程中用到的臨時空間(可為null)
 * @param swap_buf_size:swap_buf的大小
 *
 */
int MyAlgHeapPop(void * buf, size_t len, size_t step_size,
						ALG_COMPARE compare, ALG_COPY copier,
						const void * context, void * swap_buf, size_t swap_buf_size)
{
	int need_free = 0;
	if(NULL == buf || NULL == compare)
		return -1;

	if(NULL == copier)
		copier = __def_alg_copy_;

	if(swap_buf && swap_buf_size < step_size)
	{
		heap_pop(buf, len, step_size, compare, copier, context, swap_buf, swap_buf_size);

		return 0;
	}

	swap_buf = MyMemPoolMalloc(NULL, step_size);
	swap_buf_size = step_size;

	heap_pop(buf, len, step_size, compare, copier, context, swap_buf, swap_buf_size);

	MyMemPoolFree(NULL, swap_buf);

	return 0;
}

/**
 *
 * @brief 推一個元素至堆中
 *
 * @param buf:要排序的數據緩沖區起始地址
 * @param len:數組中的元素個數
 * @param step_size:每個元素的大小
 * @param value:要加入的值
 * @param value_size:value的大小
 * @param context:用戶自定義的上下文數據
 *
 */
int MyAlgHeapPush(void * buf, size_t len, size_t step_size,
						 const void * value, size_t value_size,
						 ALG_COMPARE compare, ALG_COPY copier,
						 const void * context)
{
	if(NULL == buf || NULL == value || NULL == compare || value_size > step_size || 0 == len)
		return -1;

	if(NULL == copier)
		copier = __def_alg_copy_;

	heap_push(buf, step_size, len - 1, 0, value, value_size, compare, copier, context);

	return 0;
}

/**
 *
 * @brief 調整一個堆
 *
 * @param buf:要排序的數據緩沖區起始地址
 * @param len:要排序的元素個數
 * @param step_size:每個元素的大小
 * @param hole_index:空洞節點的索引(0表示第一個節點)
 * @param value:值
 * @param value_size:值的大小
 * @param compare:比較回調(不可為空)
 * @param copier:如何拷貝(可為空)
 * @param context:用戶自定義的上下文數據
 *
 */
/*int MyAlgAdjustHeap(void * buf, size_t len, size_t step_size, 
						   size_t hole_index, const void * value, size_t value_size,
						   ALG_COMPARE compare, ALG_COPY copier,
						   const void * context)
{
	if(NULL == buf || NULL == value || NULL == compare)
		return -1;

	if(NULL == copier)
		copier = __def_alg_copy_;

	adjust_heap(buf, len, step_size, hole_index, value, value_size, compare, copier, context);

	return 0;
}*/

/**
 *
 * @brief 檢查一個序列是否為一個堆
 *
 * @param buf:要排序的數據緩沖區起始地址
 * @param len:要排序的元素個數
 * @param step_size:每個元素的大小
 * @param compare:比較回調(不可為空)
 * @param context:用戶自定義的上下文數據
 *
 */
int MyAlgExaminHeap(void * buf, size_t len, size_t step_size,
					ALG_COMPARE compare,
					const void * context)
{
	size_t parent_index = 0;
	size_t second_child = 0;

	if(NULL == buf || NULL == compare)
		return -1;

	if(len <= 1)
		return 0;

	second_child = HEAP_SECOND_CHILD_INDEX(parent_index);
	while(second_child < len)
	{
		/*
		* 只要子節點不大于父節點,都是合法的
		*/
		assert(compare(GET_INDEX_PTR(buf, second_child, step_size), GET_INDEX_PTR(buf, parent_index, step_size), context) <= 0);
		assert(compare(GET_INDEX_PTR(buf, second_child - 1, step_size), GET_INDEX_PTR(buf, parent_index, step_size), context) <= 0);

		parent_index += 1;
		second_child = HEAP_SECOND_CHILD_INDEX(parent_index);
	}

	if(second_child == len)
	{
		assert(compare(GET_INDEX_PTR(buf, second_child - 1, step_size), GET_INDEX_PTR(buf, parent_index, step_size), context) <= 0);
	}

	return 0;
}

/**
 *
 * @brief 檢查一個序列是否已經正確地被排序
 *
 * @param buf:要排序的數據緩沖區起始地址
 * @param len:要排序的元素個數
 * @param step_size:每個元素的大小
 * @param compare:比較回調(不可為空)
 * @param context:用戶自定義的上下文數據
 *
 */
int MyAlgSortOK(void * buf, size_t len, size_t step_size,
				ALG_COMPARE compare,
				const void * context)
{
	size_t i = 0;

	if(NULL == buf || NULL == compare)
		return -1;

	if(len <= 1)
		return 0;

	for(i = 1; i < len; i ++)
	{
		/*
		* 只要前一個不大于后一個,就說明被正確排序了
		*/
		if(compare(GET_INDEX_PTR(buf, i - 1, step_size), GET_INDEX_PTR(buf, i, step_size), context) > 0)
		{
			int a = 0;
			int b = a;
		}
		assert(compare(GET_INDEX_PTR(buf, i - 1, step_size), GET_INDEX_PTR(buf, i, step_size), context) <= 0);
	}

	return 0;
}
















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日一区二区三区| 99久久综合99久久综合网站| 国产不卡在线一区| 欧美日韩中字一区| 国产拍欧美日韩视频二区| 蜜臀久久久99精品久久久久久| 懂色中文一区二区在线播放| 欧美一区午夜精品| 亚洲成av人片一区二区三区| 国产一区在线观看视频| 制服丝袜一区二区三区| 亚洲欧美激情在线| 国产xxx精品视频大全| 91精品国产一区二区三区| 亚洲女女做受ⅹxx高潮| av不卡在线观看| 欧美韩日一区二区三区四区| 美女视频一区在线观看| 欧美精品日韩一本| 亚洲成人黄色小说| 在线视频一区二区三区| 亚洲欧美日韩一区| 成人av资源下载| 日本一区二区三区免费乱视频| 久久精品国产精品亚洲红杏| 麻豆国产精品777777在线| 日本欧美一区二区| 国产91精品一区二区麻豆亚洲| 国模无码大尺度一区二区三区| 欧美剧情片在线观看| 一区二区在线观看视频| 色哟哟一区二区| 夜夜精品视频一区二区 | 欧美精品xxxxbbbb| 一区二区日韩av| 欧美日韩国产精选| 五月激情综合网| 日韩欧美中文字幕公布| 蜜桃视频一区二区| 精品国产免费人成在线观看| 精品一区二区三区av| 国产亚洲短视频| 成人性生交大片免费看视频在线 | 日韩一区二区电影| 另类专区欧美蜜桃臀第一页| 久久亚洲精品小早川怜子| 狠狠狠色丁香婷婷综合激情| 久久久国产精品不卡| 高清在线不卡av| 亚洲欧洲日韩女同| 欧美色手机在线观看| 婷婷成人激情在线网| 欧美一区二区福利视频| 国产又粗又猛又爽又黄91精品| 1024精品合集| 色妹子一区二区| 奇米色一区二区| 国产精品网曝门| 欧美色图12p| 韩国毛片一区二区三区| 国产精品污污网站在线观看| 欧美女孩性生活视频| 精品亚洲国产成人av制服丝袜| 国产精品伦一区| 9191国产精品| 国产电影一区在线| 亚洲综合精品自拍| 精品国产乱码久久久久久免费| 国产成人在线影院| 亚洲国产综合在线| 国产婷婷精品av在线| 欧美手机在线视频| 丁香六月综合激情| 亚洲一区二区五区| 亚洲国产电影在线观看| 欧美一区二区免费视频| 成人av电影免费观看| 性欧美大战久久久久久久久| 欧美成人性福生活免费看| 91影院在线观看| 另类专区欧美蜜桃臀第一页| 一区二区三区精密机械公司| 久久亚洲私人国产精品va媚药| 色婷婷亚洲精品| 国产激情精品久久久第一区二区| 亚洲日本青草视频在线怡红院| 精品国产一区二区三区av性色| caoporn国产精品| 美女性感视频久久| 亚洲一区视频在线| 国产精品视频看| 2024国产精品| 日韩欧美一二三四区| 91精品办公室少妇高潮对白| 国产精品资源在线| 蜜臀99久久精品久久久久久软件| 一区二区日韩电影| 1024亚洲合集| 最近中文字幕一区二区三区| 26uuu久久综合| 日韩精品最新网址| 欧美日韩中文字幕一区| 日本国产一区二区| 精品视频资源站| 97久久超碰国产精品电影| 国产精品一区免费视频| 狠狠色丁香婷婷综合久久片| 男人的天堂亚洲一区| 日本午夜一区二区| 婷婷夜色潮精品综合在线| 亚洲国产精品自拍| 亚洲综合色自拍一区| 一区二区三区视频在线看| 亚洲免费av网站| 亚洲精品网站在线观看| 中文一区二区完整视频在线观看| 久久久精品免费免费| 国产日韩精品一区二区三区| 日本一区二区动态图| 中文一区在线播放| 亚洲日本一区二区三区| 一级日本不卡的影视| 一区二区三区蜜桃| 午夜亚洲国产au精品一区二区 | 精品久久久久一区二区国产| 日韩女优毛片在线| 久久午夜电影网| 日本一区二区三区在线不卡| 国产精品丝袜在线| 亚洲男人的天堂网| 亚洲成a人片综合在线| 美女视频一区在线观看| 国产成人亚洲精品青草天美| av动漫一区二区| 欧美日韩专区在线| 欧美va在线播放| 欧美激情一二三区| 亚洲国产cao| 精品一区二区三区免费观看| 国产成人av电影在线| 色综合色综合色综合| 欧美久久久久免费| 国产亚洲污的网站| 亚洲精品一二三区| 麻豆精品在线视频| jlzzjlzz亚洲女人18| 欧美私人免费视频| 国产欧美一区二区三区鸳鸯浴| 日韩美女啊v在线免费观看| 亚洲va欧美va天堂v国产综合| 国产精品一区二区在线观看不卡| 成人久久视频在线观看| 欧美美女直播网站| 国产三级久久久| 亚洲a一区二区| 国产99久久久久久免费看农村| 在线观看日韩国产| 欧美精品一区二区三| 亚洲一区欧美一区| 国产91精品精华液一区二区三区| 欧美三级中文字幕| 国产精品网站在线| 国产资源在线一区| 在线观看网站黄不卡| 久久精品一区二区三区不卡| 亚洲电影一区二区三区| 国产麻豆成人精品| 4438x成人网最大色成网站| 中文字幕精品一区二区精品绿巨人| 亚洲国产另类精品专区| 成人动漫精品一区二区| 精品久久久久99| 亚洲国产一区二区三区| 成人激情小说乱人伦| 日韩精品在线一区| 午夜a成v人精品| 色综合久久天天| 国产精品久久福利| 国产一区二区三区在线观看精品 | 色综合久久88色综合天天| 久久综合久久综合亚洲| 人禽交欧美网站| 91国产丝袜在线播放| 亚洲丝袜精品丝袜在线| 国产精品羞羞答答xxdd| 欧美电影免费观看高清完整版在线| 亚洲一区二区精品久久av| a亚洲天堂av| 中文字幕中文在线不卡住| 国产一区二区导航在线播放| 26uuu国产日韩综合| 久久精品国产澳门| 欧美xxxx在线观看| 免费的成人av| 日韩欧美专区在线| 奇米影视7777精品一区二区| 日韩欧美中文字幕一区| 久久超碰97人人做人人爱| 日韩精品一区二区三区在线观看 | 蜜桃av一区二区|