elva
C 语言常用的排序算法
转自:
http://blog.csdn.net/chenqiang35/archive/2009/02/19/3909699.aspx
view plain
copy to clipboard
print
?
/********************************************************************************************
平方阶(O(n2))排序
一般称为简单排序,例如直接插入、直接选择和冒泡排序
********************************************************************************************/
/*插入排序*/
extern
int
InsertSort(
int
source[],
int
array_size)
{
int
index = 1;
//插入排序
int
i, j;
for
(i = 1; i < array_size; i++)
{
index = source[i];
j = i;
while
((j > 0) && (source[j - 1] > index))
{
source[j] = source[j - 1];
j--;
}
source[j] = index;
}
return
1;
}
/*冒泡排序*/
extern
int
BubbleSort(
int
source[],
int
array_size)
{
int
i, j;
int
temp;
for
(i = 0; i < array_size; i++)
{
for
(j = 0; j < array_size - i - 1; j++)
if
(source[j] > source[j + 1])
{
temp = source[j];
source[j] = source[j + 1];
source[j + 1] = temp;
}
}
return
1;
}
/*选择排序*/
extern
int
SelectSort(
int
source[],
int
array_size)
{
int
temp, min;
int
i, j;
for
(i = 0; i < array_size; i++)
{
min = i;
//先假设最小下标为i
for
(j = i + 1; j < array_size; j++)
if
(source[j] < source[min])
min = j;
//把i之后的最小值附给min
if
(min != i)
{
temp = source[i];
source[i] = source[min];
source[min] = temp;
}
//判断min与i是否相等,若相等则说明原假设正确,反之:交换数值
}
return
1;
}
view plain
copy to clipboard
print
?
/*********************************************************************************************
线性对数阶(O(nlgn))排序
如快速、堆和归并排序
********************************************************************************************/
/*快速排序接口*/
static
int
Partition(
int
source[],
int
left,
int
right)
{
int
x = source[left];
while
(left < right)
{
while
(left < right && x <= source[right])
right--;
source[left] = source[right];
while
(left < right && x >= source[left])
left++;
source[right] = source[left];
}
source[left] = x;
return
left;
}
extern
int
QuickSort(
int
source[],
int
left,
int
right)
{
int
iPos;
if
(left >= right)
return
1;
iPos = Partition(source, left, right);
QuickSort(source, left, iPos - 1);
// 左边划分
QuickSort(source, iPos + 1, right);
// 右边划分
return
1;
}
/*堆排序*/
static
void
HeapAdjust(
int
source[],
int
root,
int
node)
/*root根节点, node节点总数*/
{
//已知source[root..node]中除source[root]之外均满足堆的定义,本函数调整source[root]
//使source[root..node]成为一个大顶堆
int
j, rc;
rc = source[root];
for
(j = 2 * root; j <= node; j *= 2)
//沿关键字叫大的结点向下筛选
{
if
(j < node && source[j] < source[j + 1])
++j;
//j为关键字较大的记录的下标
if
(rc >= source[j])
break
;
//rc应插入在位置root上
source[root] = source[j];
root = j;
}
source[root] = rc;
//插入
}
extern
int
HeapSort(
int
source[],
int
array_size)
{
int
i, t;
for
(i = array_size / 2; i > 0; --i)
//把a[1..L.length]建成大顶堆
HeapAdjust(source, i, array_size);
for
(i = array_size; i > 1; --i)
{
t = source[1];
//将堆顶记录和当前未经排序子序列a[1..i]
source[1] = source[i];
//中的最后一个记录相互交换
source[i] = t;
HeapAdjust(source, 1, i - 1);
//将r[1..i-1]重新调整为大顶堆
}
return
1;
}
view plain
copy to clipboard
print
?
/**********************************************************************************************
O(n1+£)阶排序
£是介于0和1之间的常数,即0<£<1,如希尔排序
********************************************************************************************/
/*希儿排序*/
extern
int
ShellSort(
int
source[],
int
array_size)
{
int
increament;
int
e, i, j;
/*初始步长设为n/2*/
for
(increament = array_size / 2; increament > 0; increament = increament / 2)
for
(j = increament; j < array_size; j++)
{
if
(source[j] < source[j - increament])
{
e = source[j];
for
(i = j - increament; i >= 0 && source[i] > e; i = i - increament)
source[i + increament] = source[i];
source[i + increament] = e;
}
}
return
1;
}
posted on 2009-10-26 18:05
叶子
阅读(440)
评论(0)
编辑
收藏
引用
所属分类:
C\C++
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
__attribute__((deprecated))
gdb中忽略信号处理
c语言常量
多线程程序中操作的原子性
关于多线程同步的问题
C++类型转换
函数模板和类模板
如何在C函数中传递指向二维数组的指针参数
pthread_kill
[转]Linux 的多线程编程的高效开发经验
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
导航
首页
联系
聚合
管理
统计信息
随笔 - 202
文章 - 1
评论 - 115
Trackbacks - 0
News
当你对某个领域感兴趣时,你会在走路、上课或洗澡时都对它念念不忘,你在该领域内就更容易取得成功。更进一步,如果你对该领域有激情,你就可能为它废寝忘食,连睡觉时想起一个主意,都会跳起来
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(19)
给我留言
查看公开留言
查看私人留言
随笔分类
Ajax(2)
(RSS)
ASP(13)
(RSS)
C\C++(55)
(RSS)
MPEG(23)
(RSS)
Oracle(1)
(RSS)
rootkit(3)
(RSS)
SQl(1)
(RSS)
Unix(20)
(RSS)
Web Service(4)
(RSS)
XML(2)
(RSS)
技术研究(17)
(RSS)
驱动开发(9)
(RSS)
日志(1)
(RSS)
数据结构(5)
(RSS)
随记(11)
(RSS)
外挂技术(1)
(RSS)
网络安全(16)
(RSS)
网络编程(4)
(RSS)
网络分析(2)
(RSS)
系统管理(13)
(RSS)
随笔档案
2013年11月 (1)
2013年5月 (1)
2012年5月 (1)
2012年4月 (1)
2012年2月 (1)
2012年1月 (1)
2011年12月 (1)
2011年11月 (2)
2011年2月 (2)
2011年1月 (4)
2010年11月 (4)
2010年10月 (5)
2010年9月 (2)
2010年8月 (10)
2010年7月 (1)
2010年6月 (2)
2010年5月 (1)
2010年4月 (3)
2010年3月 (3)
2010年1月 (1)
2009年10月 (3)
2009年9月 (2)
2009年8月 (6)
2009年7月 (7)
2009年6月 (1)
2009年5月 (2)
2009年4月 (1)
2009年3月 (4)
2009年2月 (2)
2009年1月 (1)
2008年12月 (1)
2008年11月 (3)
2008年10月 (2)
2008年9月 (2)
2008年8月 (3)
2008年7月 (2)
2008年6月 (3)
2008年5月 (3)
2008年4月 (4)
2008年3月 (9)
2008年2月 (8)
2008年1月 (1)
2007年12月 (5)
2007年11月 (1)
2007年10月 (6)
2007年9月 (5)
2007年8月 (7)
2007年7月 (8)
2007年6月 (6)
2007年5月 (45)
2007年4月 (2)
相册
1
2
3
other
Links
baicker
heartdbg
osronline
www.codeproject.com
www.foundstone.com
www.rootkit.com
www.xfocus.net
搜索
最新评论
1. re: 关于多线程同步的问题
。。。体会到加锁的本质了,天然的“原子”操作可以不加锁(我觉得前提是只有一个处理器)。但是如果有多个处理器呢。。
--bauerctu
2. re: 利用NtUnmapViewOfSection强制卸载模块 [未登录]
评论内容较长,点击标题查看
--小学毕业生
3. re: 如何在C函数中传递指向二维数组的指针参数
楼主错误,你讲的是指针数组和C语言中的二维数组不是一个东西
--samba_no
4. re: TS OVER IP的多画面合成[未登录]
nice
--wang
5. re: 细说 #pragma pack(n)
评论内容较长,点击标题查看
--Jacc.Kim
Powered by:
C++博客
Copyright © 叶子