本篇主要整理一些常用的排序算法:直接插入排序、希尔排序(分组插入)、直接选择排序、堆排序、冒泡排序、快速排序、归并排序.
- 插入排序(直接插入,希尔)
- 选择排序(直接选择,堆排序)
- 交换排序(冒泡,快排)
- 归并排序
编译平台: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 | 否 |