1 简单选择排序
适合数据个数n较小的情况,思想是在n个待排序数据中选出最小的,通过n-i次关键字的比较,从n-i-1个记录中选出最小的,并和第i个关键字交换;
平均时间复杂度是O(n的平方)代码如下:
void selectSort(int p[],int n){
//从小到大排序
int k,temp;
for(int i=0;i<n;i++){
k=i;
for(int j=i;j<n;j++){
if(p[k]>p[j]) k=j;
}
if(i!=k)
{
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
}
}
2 插入排序 (衍生的有希尔排序)
主要思想是将一个数插入到一个有序数列中,平均时间复杂度是O(n的平方),主要代码如下:
void insertSort(int *p,int n){ //从大到小
int temp;
int k;
for(int i=1;i<n;i++)
{
k=p[i];
if(p[i]>p[i-1])
{
int j;
p[i]=p[i-1];
for(j=i-2;j>=0;--j){
if(p[j]<p[j+1])
p[j+1]=p[j];
}
p[j+1]=k;
}
}
}
3 快速排序
主要思想是通过一趟排序,将待排序列分割成2半,左边的均比关键字小,右边的都比关键字大,平均时间复杂度是O(nlogn),空间复杂度是O(logn)。主要代码如下:
void quickSort(int *p,int m,int n){
if(m<n){
int i=m;
int j=n;
int temp;
while(i<j){
while(i<n)
if(p[i]>p[m])
break;
else
i++;
while(j>m)
if(p[j]<p[m])
break;
else
j--;
if(i<j)
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
temp=p[j];
p[j]=p[m];
p[m]=temp;
quickSort(p,m,j-1);
quickSort(p,i,n);
}
}
4 堆排序
时间复杂度不管是最好,最差还是平均的情况下都是O(logn),主要代码如下
#include <iostream>
#include<stdio.h>
using namespace std;
void heapAdjust(int *p,int m,int n){
int temp=p[m];
for(int i=m*2;i<n;i=i*2){
if(p[i]<p[i+1]) i++;
if(temp>=p[i]) break;p[m]=p[i];
m=i;
}
p[m]=temp;
}void HeapSort(int *p,int n){
int temp;
for(int i=(n-1)/2;i>=0;--i)
heapAdjust(p,i,n);for(int j=n-1;j>0;--j){
temp=p[0];
p[0]=p[j];
p[j]=temp;
heapAdjust(p,0,j-1);
}}
int main(){
int a[10]={2,5,3,1,6,7,4,10,45,34};
HeapSort(a,10);
printf("排序后数据如下:");
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}getchar();
return 0;
}