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

C语言实现几大典型排序

2013-09-17 20:44 211 查看
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;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: