Foundation Sorting: Quicksort
/* Quick Sorting.
* Implementation history:.
* 2013-09-15, Mars Fu, first version.
*/ /* [Quicksort Algorithm]
* Published by C.A.R.Hoare,[Comp. J.5(1962),10-15].
*/ #include "stdafx.h" #include "quicksort.h" int
do_quick_sort(void* src, int src_sz, int n, cmp_func cmp, exc_func exchange, dbg_func dbg)
{
const int M = 0;
int i,j,k;
int l,r;
char *kv, *ki, *kj;
static int h = 0; F_S(); if (src == NULL || cmp == NULL || exchange == NULL) return 0;
if (src_sz <= 0 || n <= 0) return 0; Q1:
/* initialize
*/
if (n <= M) {
/* do straight insertion sort
*/
return 1;
}
else {
l = 0;
r = n-1;
} Q2:
/* begine new stage
*/
i = l;
j = r + 1;
kv = (char*)src + l * src_sz; Q3:
do {
/* compare @kv with @ki
*/
do {
++i;
if (i >= j) break;
ki = (char*)src + i * src_sz;
} while (cmp(ki, kv) < 0); /* compare @kv with @kj
*/
do {
--j;
if (j <= i) break;
kj = (char*)src + j * src_sz;
} while (cmp(kv, kj) < 0); /* test i:j
*/
if (j <= i) { /* found the absolute index @j for @kv,do exchanging here and break.
*/
if (j < i) {
kj = (char*)src + j * src_sz;
exchange(kv, kj);
}
else {
/* @i == @j means no need to exchange,having been sorted already.
*/
} if (dbg) dbg(src, n, ++h);
break;
}
else {
ki = (char*)src + i * src_sz;
kj = (char*)src + j * src_sz;
exchange(ki, kj); if (dbg) dbg(src, n, ++h);
}
} while (1); Q4:
/* do the same procedure via recursion with the changed @left or @right.
*/
if(i == j) {
/* the first item is sorted already, move forward 1 item, sort again.
*/
do_quick_sort((char*)src + 1*src_sz, src_sz, n-1, cmp, exchange, dbg);
}
else {
if (j-l > 1) {
do_quick_sort((char*)src + l*src_sz, src_sz, j-l, cmp, exchange, dbg);
} if (r-j > 1) {
do_quick_sort((char*)src + i*src_sz, src_sz, r-j, cmp, exchange, dbg);
}
} END:
F_E();
return 1;
} #ifdef QUICK_SORT_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
exchange_int_item(void* lv, void* rv)
{
int tmp_lv, tmp_rv; tmp_lv = *(int*)lv;
tmp_rv = *(int*)rv; *(int*)lv = *(int*)rv;
*(int*)rv = tmp_lv;
} 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; debug("[Testing quick sort].. \r\n"); 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"); ret = do_quick_sort((void*)int_items, sizeof(int), cnt,
int_increasing_cmp, exchange_int_item, debug_func);
if (!ret) {
debug("failed. \r\n");
goto END;
} debug("dst database:\r\n----\r\n");
for (i = 0; i < cnt; ++i) {
debug("%d ", int_items[i]);
}
debug("\r\n----\r\n"); debug("\r\n"); debug("[Testing quick sort].. done. \r\n"); END:
while(1);
return 0;
} #endif /* QUICK_SORT_DEBUG */
#ifndef __QUICKSORT_H__
#define __QUICKSORT_H__ #define QUICK_SORT_DEBUG typedef int(*cmp_func)(void*, void*);
typedef void (*exc_func)(void*, void*);
typedef void (*dbg_func)(void*, int, int); int do_quick_sort(void* src, int src_sz, int n, cmp_func cmp, exc_func exchange, dbg_func dbg); #endif /* __QUICKSORT_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__)
Mars
Sep 15th, 2013
Foundation Sorting: Quicksort的更多相关文章
- Foundation Sorting: Shellsort
/* Shell Sorting. * Implemention history:. * 2013-09-15, Mars Fu, first version. */ /* [Shell Sortin ...
- Foundation Sorting: Single List Insertion Sort
/* List Insertion Sorting. * Implementation history:. * 2013-09-15, Mars Fu, first version. */ #incl ...
- The algorithm learning of sort which include Bubblesort,Insertsort,Quicksort and Mergesort.
Notice : these algorithms achieved by Java. So,let's going to it. firstly, what is Bubblesort? why w ...
- Scala比较器:Ordered与Ordering
在项目中,我们常常会遇到排序(或比较)需求,比如:对一个Person类 case class Person(name: String, age: Int) { override def toStrin ...
- scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例
package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaA ...
- Scala入门之Array
/** * 大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说: * 1,数据集合:会涉及数据的搜集.存储等,搜集会有很多技术,存储现在比较经典的是使用Hadoop,也有很多情况使用Kaf ...
- Scala集合操作
大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说: 1.数据集合:会涉及数据的搜集.存储等,搜集会有很多技术,存储技术现在比较经典方案是使用Hadoop,不过也很多方案采用Kafka. ...
- [LintCode] Sort Integers II 整数排序之二
Given an integer array, sort it in ascending order. Use quick sort, merge sort, heap sort or any O(n ...
- Array基本操作
// defined array object val arr0= ) val arr1= Array(") println(arr1()) arr1()="Hello Spark ...
随机推荐
- codeforces 603C. Lieges of Legendre sg函数
题目链接 n堆石子, 可以拿走一堆中的一颗, 或者将一堆数量为2*x的石子分为k堆x个的石子.k由题目给出. k分奇偶讨论. k为偶数时,k堆x个的石子异或结果为0: k为奇数时, k堆x个石子异或结 ...
- hdu 4493 Tutor
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4493 给你十二个月的工资,算平均数,保留两位,去除末尾的0 使用暴力解决,嘻嘻,但是这题主要是在进位这个地 ...
- java核心技术学习笔记之一程序设计概述
Java 核心技术之一程序设计概述 一. Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向 ...
- Qt监测光驱变化(使用WM_DEVICECHANGE)
xxx.h protected: bool winEvent(MSG *msg,long * result); xxx.cpp bool CBlurayTranscoderDlg::winEvent( ...
- 【Android界面实现】使用Canvas对象实现“刮刮乐”效果
在淘宝.京东等电商举办活动的时候,常常能够看到在移动client推出的各种刮奖活动,而这样的活动也受到了非常多人的喜爱.从client的体验来说,这样的效果应该是通过网页来实现的,那么,我们使用And ...
- 关于ue上传图片到七牛云设置key
多图上传设置key: dialogs文件下面,image文件下面的image.html,链接webuploader.js,不链接webuploader.min.js webuploader.js里面 ...
- ECharts的使用相关参考---转
ECharts图表组件初级入门之(一):如何将ECharts引入至项目中的几种方式 http://www.stepday.com/topic/?801 ECharts图表初级入门篇:如何配置EChar ...
- 使用Highcharts生成折线图与曲线图
折线图与曲线图可以显示随时间而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势.本文将结合Highcharts,生成一个城市气温变化折线图和一个随时间动态即时显示CPU走势的曲线图. 如果 ...
- C++对象模型--总结
http://c.biancheng.net/cpp/biancheng/view/239.html 博客园有关C++内存布局,对象模型的文章. Effective C++ 绝不重写non-virtu ...
- php生成数据字典,代码
<?php /** * 生成mysql数据字典 */ header("Content-type:text/html;charset=utf-8"); // 配置数据库 $da ...