数据结构与算法分析 L1

选择排序

原理

依次从后面 选择 最小的元素放到前面。

实现-C

//编译环境:Window+Code::Blocks

#include<stdio.h>
#include<time.h>

#define random(x) (rand()%x)

void SelectionSort(int T[], int n) {
    int i,j;
    int minj, minx;
    for(i=0; i<n-1; i++) {
        minj = i; minx = T[i];
        for(j=i+1; j<n; j++) {
            if(T[j] < minx) {
                minj = j;
                minx = T[j];
            }
        }
        T[minj] = T[i];
        T[i] = minx;
    }
}

int main(){
    int n;
    // Initialize
    scanf("%d",&n);
    int *T = (int*)malloc(sizeof(int)*n);

    int i;
    for(i=0 ; i<n ; i++){
        T[i] = random(400000);
    }

    //Selection Sort
    clock_t start,finish;
    double TheTimes;
    start=clock();

    int times = 5;
    for (i=0; i<times; i++)
        SelectionSort(T, n);

    finish=clock();
    TheTimes=(double)(finish-start)/CLOCKS_PER_SEC/times;
    printf("Time eclipse is %.6fs\n",TheTimes);

    printf("\n");
    return 0;
}

时间复杂度

n2

归并排序

原理

分治法,不断的将数列一分为二,直到子数列中只有一个元素。

实现-C

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define random(x) (rand()%x)

void Merge(int array[], int l, int mid, int r, int temp[])
{
    int i, j, k;
    k = 0;
    i = l;
    j = mid + 1;
    while( i <= mid && j <= r ) {
        if ( array[i] <= array[j] ){
            temp[k++] = array[i++];
        } else {
            temp[k++] = array[j++];
        }
    }

    while (i <= mid) {
        temp[k++] = array[i++];
    }

    while (j <= r) {
        temp[k++] = array[j++];
    }

    for (i = l; i<=r; i++) {
        array[i] = temp[i-l];
    }
}

void MergeSort_r(int array[],int l,int r,int temp[])
{
    if (l<r) {
        int mid = (l+r)/2;
        MergeSort_r(array,l,mid,temp);
        MergeSort_r(array,mid+1,r,temp);
        Merge(array,l,mid,r,temp);
    }
}

int MergeSort(int array[],int l,int r)
{
   if(r < l)
   {
      return -1;
   }

   if(r == l)
   {
      return 0;
   }

   int len = r - l + 1;
   int *temp = malloc(sizeof(int) * len);
   if(temp == NULL)
   {
      return -2;
   }
   MergeSort_r(array, l, r, temp);
   free(temp);
   return 0;
}

int main(){
    int n;
    // Initialize
    scanf("%d",&n);
    int *T = (int*)malloc(sizeof(int)*n);

    int i;
    for(i=0 ; i<n ; i++){
        T[i]= random(400000);
    }

    //Merge Sort
    clock_t start,finish;
    double TheTimes;
    start=clock();

    int times = 1000;
    for (i=0; i<times; i++)
        MergeSort(T, 0, n-1);

    finish=clock();
    TheTimes=(double)(finish-start)/CLOCKS_PER_SEC/times;
    printf("Time eclipse is %.6fs\n",TheTimes);

    printf("\n");
    return 0;
}

时间复杂度分析

Best: nlg(n)

堆排序(没看懂)

时间复杂度

nlg(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值