部分排序算法c语言实现
代码比较粗糙,主要是用于对排序算法的理解,因而忽略了边界和容错处理相关代码。
相关文档:
Insert Sort ,Bubble Sort ,Select Sort ,Shell sort ,Quick sort ,Heap sort ,Merge sort on Wikipedia
algorithm Repository :C语言实现部分排序算法,代码质量较高,其实现类似于库函数
sorting and searching algorithms :点击左边的链接即可查看整份文档
排序算法性能比较:图片链接
插入,选择,冒泡排序的算法复杂度为O(n^2)
希尔排序(shell sort)的算法复杂度因所采用增量序列的不同而有很大差别,例如shell增量序列(1,2,..,2^k)的算法复杂度可能达到O(n^2),其他增量序列则为O(n^1.5)到O(n^(7/6))不等,但其算法复杂度不可能达到O(nlogn);
快速排序,堆排序,归并排序算法复杂度为O(nlogn)。
快速排序虽然被认为是最快的,但是写一个完全正确的算法却并不容易(即在任何情况下算法复杂度均为O(nlogn)),感兴趣的可以看看glib 和bsd 的快速排序实现,有一篇论文《engineering a sort function 》中也写了qsort的实现
包含三个文件:
sort.c:
/* to compiler the program, use: gcc -o sort sort.c misc.c -g -Wall /* insert sort */ #include <stdio.h> #include <stdlib.h> #include "misc.h"int insertSort(int a[], int n); int shellSortSh(int a[], int n); int shellSortHi(int a[], int n); int shellSortKn(int a[], int n); int bubSort(int a[], int n); int selectSort(int a[], int n); int median3(int a[], int n); int quickSort(int a[], int n); int heapify(int a[],int i, int n); int heapSort(int a[], int n); int mergeArray(int a[],int splitIndex,int n); int mergeSort(int a[], int n); /* void testMedian3() {int a[3] = {3,2,1};int len = ARRLEN(a);median3(a,len);printArray(a,len);}*/ int main(void) {int a[] = {8,1,4,9,6,3,5,2,7,0};/* int a[] = {5,7,3,8};*/int len = ARRLEN(a);/* testSort(a,len,insertSort);*//* testSort(a,len,shellSortKn);*/testSort(a,len,mergeSort);/* testMedian3();*/return 0; } int insertSort(int a[], int n) {int i,j;int tmp;for(i = 0; i < n; i++){tmp = a[i];for(j = i; j > 0 && a[j-1] > tmp; --j)a[j] = a[j-1];a[j] = tmp;/* printArray(a,n);*/}return 0; } /* the origin shell sort by Shell using increment sequenceof n/2,n/4 ... 1 */ int shellSortSh(int a[], int n) {int i,j;int inc;int tmp;for(inc = n/2; inc > 0; inc /= 2)for(i = inc; i <n; i++){tmp = a[i];for(j = i; j >= inc && tmp < a[j-inc]; j -= inc)a[j] = a[j-inc];a[j] = tmp;printArray(a,n);}return 0; } /* shell sort by Hibbard's sequence:2^k-1,...,7,3,1 */ int shellSortHi(int a[],int n) {int i,j;int inc;int tmp;for(inc = 1; inc < n/2; inc = 2*inc+1) ;for( ; inc > 0; inc /= 2)for(i = inc; i <n; i++){tmp = a[i];for(j = i; j >= inc && tmp < a[j-inc]; j -= inc)a[j] = a[j-inc];a[j] = tmp;printArray(a,n);}return 0; } /* Shell sort using knuth's sequence:(3^k-1)/2,...,13,4,1 */ int shellSortKn(int a[], int n) {int i,j;int inc;int tmp;for(inc = 1; inc < n/3; inc = 3*inc+1) ;for( ; inc > 0; inc /= 3)for(i = inc; i <n; i++){tmp = a[i];for(j = i; j >= inc && tmp < a[j-inc]; j -= inc)a[j] = a[j-inc];a[j] = tmp;printArray(a,n);}return 0; } /*for shell sort there is also a Sedgewick's sequence: 1,5,19,41,...which can be constructed by:1,19,104,505,...,9(4^k-2^k)+1, k=0,1,2,3,...5,41,209,929,...,(2^(k+2))*(2^(k+2)-3)+1, k = 0,1,2,3,.. *//*bubble sort */ int bubSort(int a[], int n) {int i,j,tmp;for(i = n-1; i >= 0; --i)for(j = 0; j < i; j++)if(a[j] >a[j+1]){tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;}return 0; } /* select sort */ int selectSort(int a[], int n) {int i,j;int minIndex,minNum;for(i = 0; i < n; i++){minIndex = i;minNum = a[i];for(j = i+1; j < n; j++)if(a[j] < minNum){minIndex = j;minNum = a[j];}a[minIndex] = a[i];a[i] = minNum;}return 0; } /* partition function to find a element to cut an array to two pieces */ /* This function is used by quick sort function */ int median3(int a[], int n) {int mid = n/2-1;/* the following three sentences make sure thata[0] <= a[mid] <= a[n-1] */if(a[0] > a[mid])swap(&a[0],&a[mid]);if(a[0] > a[n-1])swap(&a[0],&a[n-1]);if(a[mid] > a[n-1])swap(&a[mid],&a[n-1]);/* exchange elemments to set the pivot at the beginning of array */swap(&a[0],&a[mid]);return a[0]; } /* quick sort */ int quickSort(int a[], int n) {int low = 1, high = n-1;int pivot;printArray(a,n);if(n <= 3){insertSort(a,n);return 0;}pivot = median3(a,n);while(low < high){while(a[low] < pivot) low++;while(a[high] > pivot) high--;if(low < high)swap(&a[low],&a[high]);elsebreak;/* printArray(a,10);*/}swap(&a[0],&a[low-1]);quickSort(a,low-1);quickSort(a+low,n-low);return 0; } int heapify(int a[], int i, int n) {int maxIndex = i;int lChild = 2*i+1,rChild = lChild+1;if(lChild < n && a[lChild] > a[maxIndex])maxIndex = lChild;if(rChild < n && a[rChild] > a[maxIndex])maxIndex = rChild;if(maxIndex != i){swap(&a[maxIndex],&a[i]);heapify(a,maxIndex,n);}return 0; } int heapSort(int a[], int n) {int i;for(i = (n-1)/2; i >= 0; i--)heapify(a,i,n);for(i = n-1; i >0; i--){swap(&a[i],&a[0]);heapify(a,0,--n);}return 0; } int mergeArray(int a[], int splitIndex, int n) {int *tmpArray = malloc(n*sizeof(int));int i ,left,right;i = left= 0;right = splitIndex;while(left < splitIndex && right < n){if(a[left] <= a[right])tmpArray[i++] = a[left++];elsetmpArray[i++] = a[right++];}while(left < splitIndex)tmpArray[i++] = a[left++];while(right < n)tmpArray[i++] = a[right++];for(i = 0; i < n; i++)a[i] = tmpArray[i];return 0; } int mergeSort(int a[], int n) {int mid;if(n > 1){mid = n/2;mergeSort(a,mid);mergeSort(a+mid,n-mid);mergeArray(a,mid,n);}return 0; }
misc.c:
#include <stdio.h> #include <time.h> #include <stdlib.h>void fillArray(int a[], int n) {int i;srand(time(NULL));for(i = 0; i < n; i++)a[i] = rand(); } void printArray(int a[], int n) {int i;printf("%d",a[0]);for(i = 1; i < n; i++)printf(" %d",a[i]);printf("\n"); } void testSort(int a[], int n, int (*sort)(int a[], int n)) {printf("the initial array is:\n");printArray(a,n);sort(a,n);printf("\nAfter sorting,the array is:\n");printArray(a,n); } void swap(int *x, int *y) {int tmp = *x;*x = *y;*y = tmp; }
misc.h:
#ifndef MISC_H #define MISC_H#define ARRLEN(a) (sizeof(a)/sizeof(a[0])) void fillArray(int a[], int n); void printArray(int a[], int n); void testSort(int a[], int n, int (*sort)(int a[], int n)); void swap(int *x, int *y); #endif
部分排序算法c语言实现相关推荐
- 经典的十种排序算法 C语言版
经典的十种排序算法(C语言版) 1.冒牌排序 冒牌排序的特点 一趟一趟的比较待排序的数组,每趟比较中,从前往后,依次比较这个数和下一个数的大小,如果这个数比下一个数大,则交换这两个数,每趟比较后, ...
- 数据结构之排序算法(C语言)
一.冒泡排序 冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面.这个过程类似于水泡向上升一样,因此而得名.举个栗子,对5,3,8,6,4这个无序序列进行冒泡 ...
- 九大排序算法-C语言实现及详解
概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...
- 鸡尾酒排序算法c语言,[golang] 数据结构-鸡尾酒排序
吐个槽 又是一个不正经取名的排序算法.真要说和鸡尾酒间的关系,大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序) 原理 鸡尾酒排序(Cocktail Sor ...
- 排序算法c语言描述---归并排序
排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...
- 五种排序算法 -- Python语言实现
交换两项位置方法: # -*- coding: utf-8 -*- def swap(lyst, i, j):temp = lyst[i]lyst[i] = lyst[j]lyst[j] = temp ...
- 加标志量的选择排序算法c语言,置换选择排序算法详解(C语言实现)
上一节介绍了增加 k-路归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值. m 的求值方法为:m=⌈n/l⌉ ...
- 睡眠排序算法c语言实现,Linux 进程必知必会
只是简单的描述了一下 Linux 基本概念,通过几个例子来说明 Linux 基本应用程序,然后以 Linux 基本内核构造来结尾.那么本篇文章我们就深入理解一下 Linux 内核来理解 Linux 的 ...
- c语言排序算法_C语言写排序算法(二) —— 选择排序
上次联系的算法是冒泡排序,不知道小伙伴们还记得不,中间穿插了一下比特币相关的分享,嘿嘿.今天来分享一下选择排序. 算法描述:选择排序是从数组中选择最大(小)的元素放到数组的最后一个,然后往前移,接着从 ...
最新文章
- 瞬变电磁法的基本原理与TEM正演技术
- JAVA_OA管理系统(二):SpringMVC笔记基础篇01注入方法
- JVM 调优实战--常用命令参数及PS收集器的GC日志格式
- 2.2.2 操作系统之进程调度的时机(主动放弃与被动放弃)、切换与过程(广义与狭义)、方式(非剥夺与剥夺)
- 物联网架构----EMQ-Hook了解、连接Kafka发送消息
- Netty in action—Bootstraping
- 对象存储 Bucket
- html标签(5):form,input,select,textarea
- Android面试你必须要知道的那些知识,已拿offer附真题解析
- ZIP压缩算法详细分析及解压实例解释
- oracle里面的分区索引,oracle patition 分区和索引
- 币安再次″被死亡″引巨震,谁在蓄意做空币圈?
- c语言中char16_t是什么类型,错误[Pe167]:类型为“uint16_t *”的参数与类型为“unsigned char *”的参数不兼容...
- 博客已迁移至简书:https://www.jianshu.com/u/68409598ede7
- 数据仓库维度建模——事实表设计
- screen ruler屏幕电子尺源码C# 手机与windows
- eis电子防抖好还是光学防抖好_全系没有OIS光学防抖的魅族17,全场景横置相机模组意义在哪里?...
- 转载ï¼å¨JavaScriptä¸è°ç¨Flexæ¹æ³
- JavaScript 中堆和栈的区别
- SVN文件不显示绿色勾子的解决方法