各种排序算法代码(C语言版)
选择排序
#include <stdio.h>
/*
* 选择排序
* 稳定性:不稳定
* 时间复杂度:O(N^2)
**/ void select_sort(int a[], int l, int r)
{
for (int m_v, m_idx, t, i = l; i < r; ++i) {
m_v = a[i]; m_idx = i;
for (int j = i + ; j < r; ++j) {
if (m_v > a[j]) {
m_v = a[j];
m_idx = j;
}
}
t = a[i]; a[i] = a[m_idx]; a[m_idx] = t;
}
} int main(void)
{
int a[];
int n; scanf("%d", &n);
for (int i = ; i < n; ++i) scanf("%d", &a[i]);
select_sort(a, , n);
for (int i = ; i < n; ++i) printf("%d ", a[i]);
return ;
}
冒泡排序
#include <stdio.h>
/*
* 冒泡排序
* 稳定性:稳定
* 时间复杂度:O(N^2)
**/ void bubble_sort(int a[], int l, int r)
{
for (int i = l; i < r; ++i) {
for (int j = l; j < r - i - ; ++j) {
if (a[j] > a[j + ]) {
int tmp = a[j];
a[j] = a[j + ];
a[j + ] = tmp;
}
}
}
} int main(void)
{
int a[];
int n; scanf("%d", &n);
for (int i = ; i < n; ++i) scanf("%d", &a[i]);
bubble_sort(a, , n);
for (int i = ; i < n; ++i) printf("%d ", a[i]);
return ;
}
插入排序
#include <stdio.h>
/*
* 插入排序
* 稳定性:稳定
* 时间复杂度: O(N^2)
**/
void insert_sort(int a[], int l, int r)
{
for (int tmp, j, i = l + ; i < r; ++i) {
tmp = a[i], j = i - ;
while (j >= l && tmp < a[j]) a[j+] = a[j--];
a[j+] = tmp;
}
} int main(void)
{
int a[];
int n; scanf("%d", &n);
for (int i = ; i < n; ++i) scanf("%d", &a[i]);
insert_sort(a, , n);
for (int i = ; i < n; ++i) printf("%d ", a[i]);
return ;
}
希尔排序
#include <stdio.h>
/*
* 希尔排序
* 稳定性:不稳定
* 时间复杂度:O(N*logN)
**/ void shell_insert_sort(int a[], int l, int r, int d)
{
for (int tmp, j, i = l + d; i < r; ++i) {
tmp = a[i], j = i - d;
while (j >= l && tmp < a[j]) {
a[j + d] = a[j];
j -= d;
}
a[j + d] = tmp;
}
} void shell_sort(int a[], int l, int r)
{
int d = (r - l) / ;
while (d >= ) {
shell_insert_sort(a, l, r, d);
d /= ;
}
} int main(void)
{
int a[];
int n; scanf("%d", &n);
for (int i = ; i < n; ++i) scanf("%d", &a[i]);
shell_sort(a, , n);
for (int i = ; i < n; ++i) printf("%d ", a[i]);
return ;
}
归并排序
/*
* 归并排序
* 稳定性:稳定
* 时间复杂度:O(N*logN)
**/
void merge(int a[], int n, int b[], int m, int t[])
{
int i, j, k;
i = j = k = ;
while (i < n && j < m) {
if (a[i] < b[j]) t[k++] = a[i++];
else t[k++] = b[j++];
}
while (i < n) t[k++] = a[i++];
while (j < m) t[k++] = b[j++];
} void my_merge_sort(int a[], int l, int r, int t[])
{
int mid = (l + r) >> ;
int n = r - l;
int i;
if (l + < r) {
my_merge_sort(a, l, mid, t);
my_merge_sort(a, mid, r, t);
merge(a+l, mid-l, a+mid, r-mid, t);
for (i = ; i < n; ++i) a[i + l] = t[i];
}
} void merge_sort(int a[], int l, int r)
{
int *t = (int *)malloc((r-l) * sizeof (int));
my_merge_sort(a, l, r, t);
free(t);
}
堆排序
#include <stdio.h>
/*
* 堆排序
* 稳定性:不稳定
* 时间复杂度:O(N*logN)
**/ // big top pile
void heap_adjust(int a[], int fa, int n)
{
int cd = fa * + ;
while (cd < n) {
if (cd + < n && a[cd] < a[cd + ]) cd++;
if (a[fa] >= a[cd]) break;
int tmp = a[fa];
a[fa] = a[cd];
fa = cd;
cd = fa * + ;
a[fa] = tmp;
}
} void build_heap(int a[], int n)
{
// ignore leap node
for (int i = (n - ) / ; i >= ; --i) {
heap_adjust(a, i, n);
}
} void heap_sort(int a[], int l, int r)
{
build_heap(a + l, r - l);
for (int tmp, i = r - ; i > l; --i) {
tmp = a[i]; a[i] = a[]; a[] = tmp;
heap_adjust(a + l, , i);
}
} int main(void)
{
int a[];
int n; scanf("%d", &n);
for (int i = ; i < n; ++i) scanf("%d", &a[i]);
heap_sort(a, , n);
for (int i = ; i < n; ++i) printf("%d ", a[i]);
return ;
}
快速排序
/*
* 快速排序
* 稳定性:不稳定
* 时间复杂度:O(N*logN)
**/
void quick_sort(int a[], int l, int r)
{
if (l + >= r) return ;
int low = l, high = r;
int key = a[l];
while (low < high) {
while (low < high && a[--high] >= key); a[low] = a[high];
while (low < high && a[++low] < key); a[high] = a[low];
}
a[low] = key;
quick_sort(a, l, low);
quick_sort(a, low+, r);
}
基数排序
/*
* 基数排序
* 稳定性:稳定
* 时间复杂度:O(d(n+radix)) [d个关键码,关键码的取值范围为radix]
**/
int tmp[];
void radix_sort(int arr[], int beg, int ed)
{
static int a[] = {, , , , , , };
int cnt[]; // 0~9十个数字
int digit = ; // 最大位数
for (int i = beg; i < ed; ++i)
while (arr[i] / a[digit + ] > ) digit++; // 从低位到高位依次排序
for (int idx = ; idx <= digit; ++idx) {
for (int i = ; i < ; ++i) cnt[i] = ; // 桶计数清零
for (int i = beg; i < ed; ++i) cnt[ arr[i]/a[idx]% ]++; // 统计每个数字出现的次数
// 前缀和 统计每个数字前面的数字个数 这样就可以知道每个数字应该排在第几位了
for (int i = ; i < ; ++i) cnt[i] += cnt[i - ];
for (int i = ed - ; i >= beg; --i) tmp[ --cnt[arr[i]/a[idx]%] ] = arr[i];
for (int i = beg, j = ; i < ed; ++i, ++j) arr[i] = tmp[j];
}
}
测试性能
int a[];
double test(void(*fun)(int*, int, int), int range)
{
for (int i = ; i < range; ++i) a[i] = rand(); clock_t start = clock();
fun(a, , range);
clock_t finish = clock(); //for (int i = 0; i < range; ++i) printf("%d\n", a[i]); return ((double)finish - start) / CLOCKS_PER_SEC;
} int main()
{
srand((unsigned)time(NULL));
printf(" 数据范围 堆排序 归并排序 希尔排序 快速排序 插入排序 冒泡排序 选择排序 基数排序\n");
for (int range = ; range <= ; range *= ) {
printf("%9d %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n", range, test(heap_sort, range), test(merge_sort, range), test(shell_sort, range),
test(quick_sort, range), test(insert_sort, range), test(bubble_sort, range), test(select_sort, range), test(radix_sort, range));
}
for (int range = ; range <= ; range *= ) {
printf("%9d %8.3f %8.3f %8.3f %8.3f %8.3f\n", range, test(heap_sort, range), test(merge_sort, range), test(shell_sort, range),
test(quick_sort, range), test(radix_sort, range));
} return ;
}
各种排序算法代码(C语言版)的更多相关文章
- 排序算法总结(C语言版)
排序算法总结(C语言版) 1. 插入排序 1.1 直接插入排序 1.2 Shell排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择 ...
- [算法] 常见排序算法总结(C语言版)
常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...
- 【最全】经典排序算法(C语言)
算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...
- 编程算法 - 高速排序算法 代码(C)
高速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的高速排序算法, 作为一个编程者, 不论什么时候都要完整的手写. 代码: /* * m ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- 【转载】常见十大经典排序算法及C语言实现【附动图图解】
原文链接:https://www.cnblogs.com/onepixel/p/7674659.html 注意: 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描 ...
- 常见排序算法总结(java版)
一.冒泡排序 1.原理:相邻元素两两比较,大的往后放.第一次完毕,最大值在最大索引处. 即使用相邻的两个元素一次比价,依次将最大的数放到最后. 2.代码: public static void bub ...
- [answerer的算法课堂]简单描述4种排序算法(C语言实现)
[answerer的算法课堂]简单描述4种排序算法(C语言实现) 这是我第一次写文章,想要记录自己的学习生活,写得不好请包涵or指导,本来想一口气写好多种,后来发现,写太多的话反而可读性不强,而且,我 ...
- 几种经典排序算法的R语言描述
1.数据准备 # 测试数组 vector = c(,,,,,,,,,,,,,,) vector ## [] 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),ord ...
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...
随机推荐
- Redis安装整理(window平台) +php扩展redis
window平台Redis安装 redis windows安装文件下载地址:http://code.google.com/p/servicestack/wiki/RedisWindowsDownloa ...
- Android:ViewPager适配器PagerAdapter的使用
PageAdapter是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. 要使用PagerAdapter, 首先要继承Pag ...
- 最短路径算法之二——Dijkstra算法
Dijkstra算法 Dijkstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 注意该算法要求图中不存在负权边. 首先我们来定义一个二维数组Edge[MAXN][MAXN]来存储 ...
- TSharding:用于蘑菇街交易平台的分库分表组件
tsharding TSharding is the simple sharding component used in mogujie trade platform. 分库分表业界方案 分库分表TS ...
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...
- 用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收
消费者:接收消息 逻辑:创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息 <?php /********* ...
- C++内存中的封装、继承、多态(下)
上篇讲述了内存中的封装模型,下篇我们讲述一下继承和多态. 二.继承与多态情况下的内存布局 由于继承下的内存布局以及构造过程很多书籍都讲得比较详细,所以这里不细讲.重点讲多态. 继承有以下这几种情况: ...
- 【HDOJ】4355 Party All the Time
好久没做过三分的题目了. /* 4355 */ #include <iostream> #include <sstream> #include <string> # ...
- Android开发UI之ListView中的Button点击设置
在ListView的Item中,如果有Button控件,那么要实现Button和Item点击都有响应,可以将Item的Layout中Button的focusable属性设为false,然后设置layo ...
- python中的commands模块
commands模块用于调用shell命令 有3中方法: commands.getstatus() 返回执行状态 commands.getoutput() 返回执行结果 commands.ge ...