各种排序算法代码(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语言描述
关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...
随机推荐
- grep正则表达式后面的单引号和双引号的区别
单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换:双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容! 一般常量用单引号' ...
- Win32 DLL和MFC DLL 中封装对话框
现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题.这里我们从Win32 DLL和MFC DLL两个方面来分析并解决这个问题. ...
- What is the innovator’s solution——什么才是创新的解决方案1
最近学习MOT(management of Technology),研读了Christensen的<创新者的窘境>和<创新者的解答>,以下简称创新者系列.总觉得需要写点儿什么. ...
- HeadFirst设计模式之策略模式
什么是策略模式:它定义了一系列算法,可以根据不同的实现调用不同的算法 大多数的设计模式都是为了解决系统中变化部分的问题 一.OO基础 抽象.封装.多态.继承 二.OO原则 1.封装变化,如把FlyBe ...
- Qt: 多线程, 就是这么简单(确实非常简洁明了)
#include <iostream>#include <QApplication>#include <QThread>#include <QString&g ...
- Microsoft SQL Server 2012 数据库安装图解教程
本文部分引用以下文章: SQL Server 2012 安装图解教程(附sql2012下载地址)_MsSql_脚本之家 http://www.jb51.net/article/36049.htm SQ ...
- 最受欢迎的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- poj 3414 Pots ( bfs )
题目:http://poj.org/problem?id=3414 题意:给出了两个瓶子的容量A,B, 以及一个目标水量C, 对A.B可以有如下操作: FILL(i) fill the ...
- one-to-many many-to-one配置解释
one-to-many放在某个文件的配置中,表示这个文件是ONE的一方, 同样的many-to-one放在某个文件的配置中,表示这个文件是many的一方.
- vijosP1026毒药?解药?
hash. 怎么感觉叫状态压缩bfs比较合适呢? #include<cstdio> #include<algorithm> #include<cstring> us ...