您的位置:首页 > 编程语言 > C语言/C++

各种排序算法(c)及时间复杂度分析

2016-03-13 22:39 351 查看
本篇主要整理一些常用的排序算法:直接插入排序、希尔排序(分组插入)、直接选择排序、堆排序、冒泡排序、快速排序、归并排序.

插入排序(直接插入,希尔)

选择排序(直接选择,堆排序)

交换排序(冒泡,快排)

归并排序

编译平台: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;
}


各个排序算法时间复杂度汇总

排序最好最差平均稳定性
快排nlognn^2nlogn
归并nlognnlognnlogn
nlognnlognnlogn
希尔n^1.3
冒泡nn^2n^2
直接插入nn^2n^2
直接选择n^2n^2n^2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 排序算法