您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法分析 L1

2015-06-04 16:16 555 查看

选择排序

原理

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

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


时间复杂度

n2n^2

归并排序

原理

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

实现-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)

堆排序(没看懂)

时间复杂度

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