Foundation Sorting: Single List Insertion Sort
- /* List Insertion Sorting.
- * Implementation history:.
- * 2013-09-15, Mars Fu, first version.
- */
- #include "stdafx.h"
- #include "list_insertion.h"
- int
- init_list(struct s_clist *hd, int max_cnt, struct s_nodes *nodes)
- {
- if (hd == NULL) return 0;
- if (max_cnt < 0) return 0;
- hd->node = NULL;
- nodes->cur = hd;
- nodes->hd = hd;
- memset(nodes->cur, 0, sizeof(struct s_clist));
- nodes->nodes_cnt = 0;
- nodes->max_nodes_cnt = max_cnt;
- debug("nodes->max_nodes_cnt %d \r\n", nodes->max_nodes_cnt);
- return 1;
- }
- int
- insert_list_sort(struct s_node *node, struct s_nodes *nodes, cmp_func cmp)
- {
- struct s_clist *tmp;
- struct s_clist *next;
- if (node == NULL) return 0;
- if (nodes->cur == NULL) return 0;
- next = (struct s_clist *)malloc(sizeof(struct s_clist));
- if (next == NULL) {
- debug("malloc list failed \r\n");
- return 0;
- }
- next->node = node;
- tmp = nodes->hd->pre;
- if (tmp == NULL) {
- tmp = nodes->hd;
- tmp->next = next;
- next->pre = tmp;
- next->next = nodes->hd;
- nodes->hd->pre = next;
- }
- else {
- while (tmp != NULL) {
- if (tmp->node == NULL) break;
- if (cmp(tmp->node->key, node->key) < 0) break;
- tmp = tmp->pre;
- }
- next->next = tmp->next;
- tmp->next->pre = next;
- tmp->next = next;
- next->pre = tmp;
- }
- nodes->cur = nodes->hd->pre;
- nodes->nodes_cnt++;
- return 1;
- }
- int
- is_list_full(struct s_nodes *nodes)
- {
- return (nodes->nodes_cnt >= nodes->max_nodes_cnt);
- }
- int
- get_list_cnt(struct s_nodes *nodes)
- {
- return nodes->nodes_cnt;
- }
- int
- delete_item_from_list(struct s_node *node, struct s_nodes *nodes)
- {
- struct s_clist *cur;
- if(node == NULL) return 0;
- cur = nodes->hd;
- cur = cur->next;
- while(cur->node != NULL) {
- if(cur->node != node) {
- cur = cur->next;
- continue;
- }
- cur->pre->next = cur->next;
- cur->next->pre = cur->pre;
- cur->next = NULL;
- cur->pre = NULL;
- free(cur->node);
- free(cur);
- nodes->nodes_cnt--;
- return 1;
- }
- return 0;
- }
- #ifdef LIST_INSERTION_DEBUG
- static int
- int_increasing_cmp(void* lv, void* rv)
- {
- int tmp_lv, tmp_rv;
- tmp_lv = *(int*)lv;
- tmp_rv = *(int*)rv;
- return (tmp_lv - tmp_rv);
- }
- static void
- debug_func(void*src, int n, int h)
- {
- int i;
- debug("%d-sort:\r\n----\r\n", h);
- for (i = 0; i < n; ++i) {
- debug("%d ", *((int*)src + i));
- }
- debug("\r\n----\r\n");
- }
- int
- main(int argc, char* argv[])
- {
- int i;
- int cnt;
- const int int_items[] = { 503, 87, 512, 61, 908, 170, 897, 275,
- 653, 426, 154, 509, 612, 677, 765, 703
- };
- int ret;
- struct s_clist hd;
- struct s_nodes nodes;
- struct s_node *node;
- struct s_clist *cur;
- debug("[Testing list insertion sort].. \r\n");
- ret = init_list(&hd, 1000, &nodes);
- if (!ret) goto END;
- cnt = sizeof(int_items)/sizeof(int_items[0]);
- debug("src database:\r\n----\r\n");
- for (i = 0; i < cnt; ++i) {
- debug("%d ", int_items[i]);
- }
- debug("\r\n----\r\n");
- for (i = 0; i < cnt; ++i) {
- node = (struct s_node*)malloc(sizeof(struct s_node));
- if (node == NULL) goto END;
- node->key = (void*)(&int_items[i]);
- ret = insert_list_sort(node, &nodes, int_increasing_cmp);
- if (!ret) {
- debug("failed. \r\n");
- goto END;
- }
- }
- debug("dst database:\r\n----\r\n");
- cur = nodes.hd->next;
- while(cur->node != NULL) {
- debug("%d ", *(int*)cur->node->key);
- cur = cur->next;
- }
- debug("\r\n----\r\n");
- debug("\r\n");
- debug("[Testing list insertion sort].. done. \r\n");
- END:
- while(1);
- return 0;
- }
- #endif /* LIST_INSERTION_DEBUG */
- #ifndef __LIST_INSERTION_H__
- #define __LIST_INSERTION_H__
- #define LIST_INSERTION_DEBUG
- typedef int(*cmp_func)(void*, void*);
- typedef void (*dbg_func)(void*, int, int);
- struct s_node{
- void* key;
- void *data;
- };
- struct s_clist{
- struct s_clist *pre;
- struct s_clist *next;
- struct s_node *node;
- };
- struct s_nodes
- {
- struct s_clist *hd;
- int nodes_cnt;
- int max_nodes_cnt;
- struct s_clist *cur;
- };
- int init_list(struct s_clist *hd, int max_cnt, struct s_nodes *nodes);
- int insert_list_sort(struct s_node *node, struct s_nodes *nodes);
- int is_list_full(struct s_nodes *nodes);
- int get_list_cnt(struct s_nodes *nodes);
- int delete_item_from_list(struct s_node *node, struct s_nodes *nodes);
- #endif /* __LIST_INSERTION_H__ */
- #pragma once
- #include <windows.h>
- #ifdef _WIN32
- #define msleep(x) Sleep(x)
- #endif
- #include <stdio.h>
- #include <tchar.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include <string.h>
- #include <math.h>
- #define MY_DEBUG
- #ifdef MY_DEBUG
- #define debug printf
- #else
- #define debug(x,argc, __VA_ARGS__) ;
- #endif /* MY_DEBUG */
- #define F_S() debug("[%s]..\r\n", __FUNCTION__)
- #define F_E() debug("[%s]..done. \r\n", __FUNCTION__)
Enjoy :)
Mars
Sep 15th, 2013
Foundation Sorting: Single List Insertion Sort的更多相关文章
- [Algorithms] Sorting Algorithms (Insertion Sort, Bubble Sort, Merge Sort and Quicksort)
Recently I systematicall review some sorting algorithms, including insertion sort, bubble sort, merg ...
- Codeforces Round #212 (Div. 2) C. Insertion Sort
C. Insertion Sort Petya is a beginner programmer. He has already mastered the basics of the C++ lang ...
- 【LeetCode OJ】Insertion Sort List
Problem: Sort a linked list using insertion sort. The node of the linked list is defined as: /** * D ...
- Foundation Sorting: Quicksort
/* Quick Sorting. * Implementation history:. * 2013-09-15, Mars Fu, first version. */ /* [Quicksort ...
- 《算法4》2.1 - 插入排序算法(Insertion Sort), Python实现
排序算法列表电梯: 选择排序算法:详见 Selection Sort 插入排序算法(Insertion Sort):非常适用于小数组和部分排序好的数组,是应用比较多的算法.详见本文 插入排序算法的语言 ...
- 【HackerRank】Insertion Sort Advanced Analysis(归并排序求数列逆序数对)
Insertion Sort is a simple sorting technique which was covered in previous challenges. Sometimes, ar ...
- 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-002插入排序法(Insertion sort)
一.介绍 1.时间和空间复杂度 运行过程 2.特点: (1)对于已排序或接近排好的数据,速度很快 (2)对于部分排好序的输入,速度快 二.代码 package algorithms.elementar ...
- [Algorithms] Insertion sort algorithm using TypeScript
Insertion sort is a very intuitive algorithm as humans use this pattern naturally when sorting cards ...
- 洛谷 SP9722 CODESPTB - Insertion Sort
洛谷 SP9722 CODESPTB - Insertion Sort 洛谷传送门 题目描述 Insertion Sort is a classical sorting technique. One ...
随机推荐
- virtualBox文件共享
具体过程,可以参考: http://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html 共享命令:sudo mount -t vboxsf ...
- 通过springmvc的RequestMapping的headers属性的使用
直接上图: springmvc中可以通过@RequestMapping注解折配置headers属性,也就是通过headers属性来配置请求头信息,从而通过这个属性值来映射请求,因为不同浏览器的Acce ...
- 1分钟搞定超慢SQL
前几天,一个用户的研发人员找到我了,说他们有个SQL语句非常慢,我说多慢?他们说:半个小时也没出结果.于是问他们要了SQL语句和执行计划,SQL语句就不能再这里贴出来了,下面是调整前的执行计划(略去某 ...
- Google市场推广统计
Google Play作为Android最大的应用市场,也存在这推广等常用的行为,那么如何统计呢,Google Analytics SDK或者其他的SDK都提供了方法,实际上是可以不需要任何sdk,完 ...
- ZOJ 38727(贪心)
这道题真心坑.越想越远 想的飞起来了. 最后纠结起后缀表达式的定义来了. 题意: 就是给你一个串 , 让你用最少改动次数来实它变成一个合法的后缀表达式, 改动方式有两种, 一种是直接加入数字或者 ...
- javascript操作HTML元素
操作 HTML 元素 如需从 JavaScript 访问某个 HTML 元素,您可以使用 document.getElementById(id) 方法. 请使用 "id" 属性来标 ...
- ASPxGridView后台获取edit、delete、选择框等按钮。
GridViewCommandColumn commandColumn = (GridViewCommandColumn)ASPxGridViewInstance.Columns["#&qu ...
- 快速检查SQL两表数据是否一致
1前话 项目内实现了一新功能:克隆数据库. 2目标 克隆并非用SQLSERVER克隆,故完毕后需要检查各表内一些数据与原表一致性.一些表中的某一些列容许不一致. 3实现 将两表的需要检查的几列取出,相 ...
- 注解方式实现Spring声明式事务管理
1.编写实体类 public class Dept { private int deptId; private String deptName; public int getDeptId() { re ...
- list根据所存对象属性排序
比如有个list,里面存的是一个个对象,对象有个list属性,其值可以是字符串和数字. private void getSortList(List<AclResource> newList ...