各种排序算法(c)及时间复杂度分析
2016-03-13 22:39
351 查看
本篇主要整理一些常用的排序算法:直接插入排序、希尔排序(分组插入)、直接选择排序、堆排序、冒泡排序、快速排序、归并排序.
插入排序(直接插入,希尔)
选择排序(直接选择,堆排序)
交换排序(冒泡,快排)
归并排序
编译平台:VS2010
插入排序(直接插入,希尔)
选择排序(直接选择,堆排序)
交换排序(冒泡,快排)
归并排序
编译平台:VS2010
直接插入排序
#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int a[] = {4,8,7,5,4,9,0,1}; int j,tmp; for(int i = 1;i<8;i++){ j = i-1; tmp = a[i]; while(j>=0&&a[j]>tmp){ a[j+1] = a[j]; j--; } a[j+1] = tmp; } for(int i = 0;i<8;i++){ printf("%d ",a[i]); } printf("\n"); system("pause"); return 0; }
希尔排序
#include "stdafx.h" void ShellSort(int a[],int n){ int tmp,gap=n/2,j; while(gap>0){ for(int i= gap;i<n;i++){ j=i-gap; tmp = a[i]; while(j>=0&&a[j]>tmp){ a[j+gap] = a[j]; j = j-gap; } a[j+gap] = tmp; } gap = gap/2; } } int _tmain(int argc, _TCHAR* argv[]) { int a[] = {8,7,6,5,4,3,2,1}; int n = 8; for(int i =0;i<n;i++){ printf("%d ",a[i]); } printf("\n"); system("pause"); return 0; }
直接选择排序
#include "stdafx.h" void choiceSort(int a[],int n){ int k,tmp; for(int i = 0;i<n-1;i++){ k=i; for(int j = i+1;j<n;j++){ if(a[j]<a[k]) k = j; } if(k!=i){ tmp = a[i]; a[i] = a[k]; a[k] = tmp; } } } int _tmain(int argc, _TCHAR* argv[]) { int a[] = {8,7,6,5,4,3,2,1}; choiceSort(a,8); for(int i =0;i<8;i++) printf("%d ",a[i]); printf("\n"); system("pause"); return 0; }
堆排序
#include "stdafx.h" void SiftDown(int A[],int i,int n){ bool done = false; int tmp; if(2*i>n)//i是下标(下标经过修改,与k一致),n是 总数 return; while(2*i<=n&&!done){ i = 2*i; if(i+1<=n&&A[i]<A[i+1]) i=i+1; if(A[i]>A[i/2]){ tmp = A[i]; A[i] = A[i/2]; A[i/2] = tmp; }else done = true; } } void MakeHeap(int A[],int n){ for(int i = n/2;i>=1;i++){ SiftDown(A,i,n); } for(int i = 1;i<=n;i++){ printf("%d ",A[i]); } printf("\n"); } void HeapSort(int A[],int n){ int tmp; for(int i = n;i>=2;i--){ tmp = A[i]; A[i] = A[1]; A[1] = A[i]; SiftDown(A,i,n); } for(int i = 1;i<=n;i++){ printf("%d ",A[i]); } printf("\n"); } void SiftUp(int A[],int i){ int tmp; bool done = false; if(i==1) return; while(i>1&&!done){ if(A[i]>A[i/2]){ tmp = A[i]; A[i] = A[i/2]; A[i/2] = tmp; }else{ done = true; } i=i/2; } } int _tmain(int argc, _TCHAR* argv[]) { int a[] = {3,1,2,3}; MakeHeap(a,a[0]); /*HeapSort(a,8);*/ system("pause"); return 0; }
冒泡排序
#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int a[] = {8,7,6,5,4,3,2,1},tmp; for(int i = 0;i<8;i++){ for(int j = 7;j>i;j--){ if(a[j]<a[i]){ tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } } for(int i = 0;i<8;i++){ printf("%d ",a[i]); } printf("\n"); system("pause"); return 0; }
快速排序
#include "stdafx.h" void QuickSort(int a[],int s,int t){ int i = s,j=t,tmp; if(s<t){ tmp = a[s]; while(i<j){ while(i<j&&a[j]>=tmp) j--; a[i]=a[j]; while(i<j&&a[i]<tmp) i++; a[j]=a[i]; } a[i] = tmp; QuickSort(a,s,i-1); QuickSort(a,i+1,t); } } int _tmain(int argc, _TCHAR* argv[]) { int a[] = {8,7,6,5,4,3,2,1}; QuickSort(a,0,7); for(int i = 0;i<8;i++){ printf("%d ",a[i]); } printf("\n"); system("pause"); return 0; }
归并排序
#include "stdafx.h" #define MaxSize 50 /* 对有序的两段数组A[p..q]和A[q+1...r]进行合并并排序 */ void merge(int a[],int p,int q,int r){ int B[MaxSize],s = p,t = q+1,k = 0; while(s<=q&&t<=r){ if(a[s] <=a[t]){ B[k] = a[s]; s++; }else{ B[k] = a[t]; t++; } k++; } if(s=q+1){ for(int i = k;i<= r-p;i++){ B[i] = a[t]; t++; } }else{ for(int i = k;i<= r-p;i++){ B[i] = a[s]; s++; } } k=0; for(int i = p;i<=r;i++){ a[p] = B[k]; k++; } } void mergesort(int a[],int low,int high){ int mid; if(low<high){ mid = (high+low)/2; mergesort(a,low,mid); mergesort(a,mid+1,high); merge(a,low,mid,high); } } int _tmain(int argc, _TCHAR* argv[]) { int a[] = {9,8,7,6,5,4,3,2,1}; mergesort(a,0,8); for(int i =0;i<=8;i++) printf("%d ",a[i]); printf("\n"); system("pause"); return 0; }
各个排序算法时间复杂度汇总
排序 | 最好 | 最差 | 平均 | 稳定性 |
---|---|---|---|---|
快排 | nlogn | n^2 | nlogn | 否 |
归并 | nlogn | nlogn | nlogn | 是 |
堆 | nlogn | nlogn | nlogn | 是 |
希尔 | n^1.3 | 否 | ||
冒泡 | n | n^2 | n^2 | 是 |
直接插入 | n | n^2 | n^2 | 是 |
直接选择 | n^2 | n^2 | n^2 | 否 |
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- JavaScript演示排序算法
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置