选择排序

#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语言版)的更多相关文章

  1. 排序算法总结(C语言版)

    排序算法总结(C语言版) 1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择 ...

  2. [算法] 常见排序算法总结(C语言版)

    常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...

  3. 【最全】经典排序算法(C语言)

    算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...

  4. 编程算法 - 高速排序算法 代码(C)

    高速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的高速排序算法, 作为一个编程者, 不论什么时候都要完整的手写. 代码: /* * m ...

  5. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  6. 【转载】常见十大经典排序算法及C语言实现【附动图图解】

    原文链接:https://www.cnblogs.com/onepixel/p/7674659.html 注意: 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描 ...

  7. 常见排序算法总结(java版)

    一.冒泡排序 1.原理:相邻元素两两比较,大的往后放.第一次完毕,最大值在最大索引处. 即使用相邻的两个元素一次比价,依次将最大的数放到最后. 2.代码: public static void bub ...

  8. [answerer的算法课堂]简单描述4种排序算法(C语言实现)

    [answerer的算法课堂]简单描述4种排序算法(C语言实现) 这是我第一次写文章,想要记录自己的学习生活,写得不好请包涵or指导,本来想一口气写好多种,后来发现,写太多的话反而可读性不强,而且,我 ...

  9. 几种经典排序算法的R语言描述

    1.数据准备 # 测试数组 vector = c(,,,,,,,,,,,,,,) vector ## [] 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),ord ...

  10. 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

    关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...

随机推荐

  1. Android EditText边框颜色的selector 使用focus标记当前填写的框

    案例:当选中一个EditText时,将其边框变为蓝色,其他未被选中的EditText则为灰色. 主界面: <?xml version="1.0" encoding=" ...

  2. [扫描线]POJ2932 Coneology

    题意:有n个圆 依次给了半径和圆心坐标  保证输入的圆不相交(只有 相离 和 内含/外含 的情况)   问 有几个圆 不内含在其他圆中,并分别列出这几个圆的编号(1~n) (n的范围是[1, 4000 ...

  3. [itint5]两数积全为1

    http://www.itint5.com/oj/#18 这一题,首先如果直接去算的话,很容易就超出int或者long的表示范围了.那么要利用%的性质,(num * 10 + 1) % a = 10 ...

  4. Android TabHost中实现标签的滚动以及一些TabHost开发的奇怪问题

    最近在使用TabHost的时候遇到了一些奇怪的问题,在这里总结分享备忘一下. 首先说一点TabActivity将会被FragmentActivity所替代,但是本文中却是使用的TabActivity. ...

  5. 关于TableView中出现deallocated问题

    Message sent to deallocated instance 关于的ios 开发中 deallocated问题,相信大家遇到了不少了: 关于怎么查找解决这个问题,特别是当问题在tableV ...

  6. WinAPI——Windows 消息

    消息 值  注释  WM_NULL $0000   WM_CREATE $0001   WM_DESTROY $0002   WM_MOVE $0003   WM_SIZE $0005   WM_AC ...

  7. Application.CommonAppDataPath的路径

    Application.CommonAppDataPath; win7的路径 C:\ProgramData\CompanyName\ProductName\2.0.5.1 [assembly: Ass ...

  8. Windows使用virtualenv搭建flask开发环境

    virtualenv: VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响,它能够: 在没有权限的情况下安装新套件 不同应用可以使用不同 ...

  9. HTML5学习(五)----SVG

    参考教程地址:http://www.w3school.com.cn/html5/html_5_svg.asp HTML5 支持内联 SVG. 什么是SVG? SVG 指可伸缩矢量图形 (Scalabl ...

  10. 学习Android之内部类

    java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又分为:常规内部类.局部内部类.匿名内部类和静态嵌套类四种.我们内部类的知识在Android手机开发中经常用到. 一.常规内部 ...