《Linux C编程一站式学习》读书笔记(2)

来源:互联网 发布:pmp十五矩阵 编辑:程序博客网 时间:2024/06/07 11:11

       归并排序采用的是分而治之的策略,时间复杂度为nlg(n)。其一般步骤如下:

     (1)Divide:把长度为n的输入序列分成两个长度为n/2的子序列。

    (2)Conquer:对这两个序列分别采用归并排序。

    (3)Merge:将两个子序列合并成一个序列。

       实现如下:

#include "stdio.h"#include "stdlib.h"#define LEN 8int a[LEN] = {100,4,88,32,90,10,1,2};void merge(int start,int mid,int end){   int i,j,k;   int n1 = mid -start + 1;   int n2 = end -mid;   int temp1[n1];   int temp2[n2];   for(i = 0;i < n1;i++)     temp1[i] = a[start + i];   for(j = 0;j < n2;j++)     temp2[j] = a[mid+1+j];   for(i = 0,j = 0;i < n1 && j < n2;)     {        if(temp1[i] > temp2[j])           {             a[start+i+j] = temp1[i];             i++;            }        else           {             a[start+i+j] = temp2[j];             j++;            }     }    while(i < n1)     {       a[start+i+j] = temp1[i];       i++;     }    while(j < n2)    {       a[start+i+j] = temp2[j];       j++;    }}void sort(int start,int end){   int mid = (start + end)/2;   if(end > start) {    sort(start,mid);    sort(mid+1,end);    merge(start,mid,end); }}int main(void){  int i;  sort(0,LEN -1);  for(i = 0; i < LEN ;i++)     printf("%d ",a[i]);}


       快速排序是另一种采取分而治之的排序算法,平均时间复杂度也是nlg(n),但其时间常数要比归并排序小。其具体实现如下: 

       

#include "stdio.h"void quick_sort(int start,int end,int * num){  int index;  if(start < end) {   int head = start;   int tail = end;   index = start;   while(head != tail)  {    while(num[tail] < num[index])          tail--;    swap(&num[index],&num[tail]);    index = tail;    while(num[head] > num[index])          head++;    swap(&num[index],&num[tail]);    index = head;  }    quick_sort(start,index-1,num);  quick_sort(index+1,end,num); }}void swap(int * a,int * b){   int temp = *a;   *a = *b;   *b = temp;}int main(void){  int i;  int a[8] = {1,4,3,2,7,6,5,8};  quick_sort(0,7,a);  for(i = 0;i < 8;i++)   printf("%d  ",a[i]);  printf("\n");}

  

0 0