C语言实现几大典型排序

来源:互联网 发布:丁丁软件是什么情况 编辑:程序博客网 时间:2024/05/30 04:19

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;
}