排序算法及实现

来源:互联网 发布:midi伴奏制作软件 编辑:程序博客网 时间:2024/06/06 02:15


排序算法可以总结为如下:

都将数组分为已排序部分和未排序部分。

冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。

插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。

选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。

 

几种排序算法,可以执行运行

这是测试结果:  希尔排序最快

C 语言shelltime 0.034712selecttime 11.054244bubbletime 27.751209inserttime 15.421586sorttime 8.588640代码实现:#include <stdio.h>#include <stdlib.h>#include <time.h>int a[100000];int b[100000];int c[100000];int d[100000];int e[100000];int n=100000 ;// 产生随机数int outrand(void)  // 产生随机数{  int i;  srand(time(0));  for(i=0; i < n; i++)  {     a[i] = rand()%100;     b[i] = a[i];     c[i] = a[i];     d[i] = a[i];     e[i] = a[i];  }}// 打印输出void output(int a[],int n){    int i;    for (i = 0; i < n; i++)    printf("%d, ",a[i]);    printf("\n");}// 二分法插入排序void sort(int a[],int n)   // 二分法插入排序{    int i,  temp, m, d, k;    int high,low;    for(i = 1; i < n; i++)  // 从未排序序列 选择一个    {        high = i -1;        low = 0;        m =  high/2;        while(high >= low) // 用二分法 查询         {           m = (high + low)/2;           if(a[m] == a[i])            break;           if(a[m] > a[i])           {              high = m -1;              d = 0;           }           else if(a[m] < a[i])           {              low = m + 1;              d = 1;           }       }       for(k = i; m < i-d; m++,k--) // 把i值 插入       {           temp = a[k];           a[k] = a[k-1];           a[k-1] = temp;       }    }}// 插入排序void insertsort(int a[],int n){    int i, j, temp;    for (i = 1; i < n ; i++)  // 从未排序序列中 选择一个,假定 0 已经是已排序列      for(j = i; j > 0; j--)  // 对已排序 序列操作      if(a[j-1] > a[j])   // 相当于冒泡      {         temp = a[j];         a[j] = a[j-1];         a[j-1] = temp;      }}// 希尔排序, 其实就是分组后,在每组中用插入排序,然后再分组,再插入排序void shellsort(int a[],int n){    int i, j, gap;    for (gap = n / 2; gap > 0; gap /= 2) // 分组 步长        for (i = 0; i < gap; i++)        // 每组都要用插入排序        {            for (j = i + gap; j < n; j += gap)                if (a[j] < a[j-gap])                {                    int temp = a[j];                    int k = j-gap;                    while (k >= 0 && a[k] > temp)                    {                        a[k + gap] = a[k];                        k -=gap;                    }                    a[k + gap] = temp;                }        }}// 选择排序void selectsort(int a[],int n){    int i, j, max ,temp;    for (i = 0; i < n-1 ; i++i) // 第一层循环是,把找到的最大值,排到已排序的序列中    {      max = i;      for(j = i; j < n; j++) // 第二层循环是 从未排序序列中找最大值      if( a[max] < a[j+1])        max =j+1;      temp = a[max];           a[max] = a[i];      a[i] = temp;    }}// 冒泡排序void bubblesort(int a[],int n){      int i, j, temp;        for (i = 0; i < n ; i++)   // 第一层循环是       for(j = 0; j < n-i-1;j++) // 两两比对,          if(a[j] > a[j+1])          {              temp = a[j];              a[j] = a[j+1];              a[j+1] = temp;          }}  // 主函数void main(void){   clock_t start,end;   outrand();   start = clock();   shellsort(a,n);   end = clock();   printf("shelltime %f \n",(double)(end-start)/1000000);   start = clock();   selectsort(b,n);   end = clock();   printf("selecttime %f \n",(double)(end-start)/1000000);   start = clock();   bubblesort(c,n);   end = clock();   printf("bubbletime %f \n",(double)(end-start)/1000000);     start = clock();   insertsort(d,n);   end = clock();   printf("inserttime %f \n",(double)(end-start)/1000000);   start = clock();      sort(e,n);   end = clock();   printf("sorttime %f \n",(double)(end-start)/1000000);}


原创粉丝点击