排序算法------归并排序
2013-01-06 10:02
323 查看
#include<stdio.h> #include<stdlib.h> #define Status int #define max 20 typedef struct { Status key; }ElemType; typedef struct { ElemType r[max]; int length; }Sqlist; void Inital(Sqlist &L) //初始化 { L.r[1].key=49; L.r[2].key=38; L.r[3].key=65; L.r[4].key=97; L.r[5].key=76; L.r[6].key=13; L.r[7].key=27; L.r[8].key=49; L.length=8; } bool LT(int i,int j) { if(i<j) return true; else return false; } void Merge(ElemType sr[],ElemType tr[],int i,int m,int n)//将sr从m分开的两部分合并到tr中去 { int j,k; for(j=m+1,k=i;i<=m&&j<=n;++k) //j用来记录sr数组中后半部分,k用来记录前半部分 { if(sr[i].key<sr[j].key) tr[k]=sr[i++];//如果后半部分打头的比前半部分打头的大,将小的那个给tr else tr[k]=sr[j++]; //反之把大的给tr } while(i<=m||j<=n) //当一个部分已经没了而另一部分还有时 { if(j<=n) tr[k++]=sr[j++]; if(i<=m) tr[k++]=sr[i++]; } } void MSort(ElemType sr[],ElemType tr1[],int s,int t)//sr数组用来提供原始序列,tr1用来存储排好的序列的 { ElemType tr2[20]; int m; if(s==t) tr1[s]=sr[s]; //如果在平分的时候还剩一个直接给tr1,不合并了 else{ m=(s+t)/2;//将sr[s...t]平均分成sr[s...m]和sr[m+1...t] MSort(sr,tr2,s,m);//用递归的方法将sr[s...m]归并到有序的tr2[s....m] MSort(sr,tr2,m+1,t);//用递归的方法将sr[m+1...t]归并到有序的tr2[m+1....t] Merge(tr2,tr1,s,m,t);//将两部分归并到tr1中 } } void MergeSort(Sqlist &l) //归并排序算法 { MSort(l.r,l.r,1,l.length); //一个l.r是提供初始序列的,另一个l.r是用来存储排好的序列的 } void print(Sqlist l) { int i; printf("排序后的结果为:"); for(i=1;i<=l.length;i++) { printf("%d ",l.r[i].key); } } void main() { Sqlist l; Inital(l); MergeSort(l); print(l); getchar(); getchar(); } //算法分析:1.归并排序所需的时间复杂度为O(nlogn) //2.归并排序所需的辅助存储空间为O(n) //3.是一种稳定的排序方法
相关文章推荐
- 排序算法之归并排序
- 经典排序算法学习笔记六——归并排序
- 排序算法--归并排序
- 数据结构(C#)_排序算法(归并排序)
- 各类排序算法实现(堆排序、希尔排序、快速排序、归并排序等)
- 排序算法之归并排序
- 排序算法——归并排序
- 排序算法——归并排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 排序算法(7)——归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法-------归并排序
- 9种排序算法——堆排序,归并排序,插入排序,选择排序
- 重温几种排序算法之希尔排序、归并排序、快速排序
- 排序算法(堆排序、插入排序、归并排序、快速排序)
- 排序算法之归并排序
- 各种排序算法-Java-冒泡、选择、插入、快速、归并排序
- 基本排序算法(3)——关于分治法及归并排序