排序算法及实现

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

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

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

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

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

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

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

C 语言
shelltime 0.034712
selecttime 11.054244
bubbletime 27.751209
inserttime 15.421586
sorttime 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++) // 第一层循环是,把找到的最大值,排到已排序的序列中
    {
        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);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值