选择排序

#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. FocusWriter

    2. FocusWriter 如果你正在从事某种写作——小说.博客.文档等——你绝对希望认识一下FocusWriter.它已经有近十年的发布历史了,但是一直是我们最喜欢的无分心写作应用之一.如果你希望 ...

  2. Ado.Net小练习01(数据库文件导出,导入)

    数据库文件导出主要程序: <span style="font-family: Arial, Helvetica, sans-serif;"><span style ...

  3. C#基础精华05(正则表达式,)

    正则表达式 . 任意一个字符 除了\n以外的 []  [0-9]       [0-9a-zA-Z] |  或   [0-9]|[a-z] ()   提升优先级别   分组 ([a]|[0-9])[0 ...

  4. P94、面试题12:打印1到最大的n位数

    题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的3位数999. 思路:先把字符串中的每一个数字都初始化为‘0’,然后每一次为字符串表示的数字加1,再打印 ...

  5. P107、面试题15:链表中倒数第K个结点

    题目:输入一个链表,输出该链表中倒数第K个结点.为了符合大多数人的习惯,本体从1开始奇数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始他们的值一次是1.2.3.4.5.6.这个 ...

  6. itoa函数的实现(不同进制)

    2013-07-08 17:12:30 itoa函数相对于atoi函数,比较简单,还是要注意考虑的全面. 小结: 一下几点需要考虑: 对负数,要加上负号: 考虑不同进制,根据要求进行处理:对不同的进制 ...

  7. FastScroll(2)不分组的listview 打开fastscroll的分组提示功能

    本文只让fastscroll具有提示分组功能,但listview并不显示分组,如果想让分组的listview显示fastscroll,看下篇. 1,在listview中打开fastscroll 2,自 ...

  8. ADT中的代码补全设置

    设置自动补全代码 刚刚学Android,有很多变量和方法 都不熟悉.需要有提示,才更加方便. 快捷方式:Alt + /    可以出现代码提示. 默认的只有输入“ .” 以后才会有代码补全提示,可作如 ...

  9. 三个入侵的必备小工具-lcx.exe、nc.exe、sc.exe

      lcx.exe的使用方法 以前抓肉鸡都是通过1433弱口令,然后.. 但是发现很多服务器开了1433,3389,但是终端是连不上的,因为服务器本身是在内网,只对外开放了1433端口,幸好有lcx. ...

  10. WVGA-维基百科

    WVGA是一种屏幕分辨率的规格,其中的W意味宽(wide),长宽比为800×480.与之相关的还有VGA(640×480)和FWVGA(854×480). WVGA并不是16:9比例,而是5:3的显示 ...