归并排序

陌路散爱 提交于 2020-08-18 12:59:58

归并排序

1.归并排序介绍:归并排序是比较类中最快的排序算法,其次是快速排序和堆排序,两者排序速度不相上下,但是数据的初始状态对堆排序的影响不大但是却能极大的影响快速排序的排序效率。
2.归并排序的排序思路:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。主要思路是将一个需要排序的序列通过递归不断的划分成一个小的区间,直至每一个小的区间只有一个元素的时候即可(因为只有一个元素的区间默认是有序的),然后将排序好的子序列进行合并最后合并成一个已经排序好的完整序列。
主要实现代码如下:

//合并函数代码:
void Merge(int arr[], int low, int mid, int high){
 //low为第1有序区的第1个元素,i指向第1个元素, mid为第1有序区的最后1个元素
 int i = low, j = mid + 1, k = 0;  //mid+1为第2有序区第1个元素,j指向第1个元素
 int *temp = new int[high - low + 1]; //temp数组暂存合并的有序序列
 while (i <= mid&&j <= high){
  if (arr[i] <= arr[j]) //较小的先存入temp中
   temp[k++] = arr[i++];
  else
   temp[k++] = arr[j++];
 }
 while (i <= mid)//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
  temp[k++] = arr[i++];
 while (j <= high)//同上
  temp[k++] = arr[j++];
 for (i = low, k = 0; i <= high; i++, k++)//将排好序的存回arr中low到high这区间
  arr[i] = temp[k];
 delete[]temp;//释放内存,由于指向的是数组,必须用delete []
}
//划分函数代码
void MergeSort (int arr [], int low,int high) {
if(low>=high) { return; } // 终止递归的条件,子序列长度为1
int mid =  low + (high - low)/2;  // 取得序列中间的元素
MergeSort(arr,low,mid);  // 对左半边递归
MergeSort(arr,mid+1,high);  // 对右半边递归
Merge(arr,low,mid,high);  // 合并
}
//主函数如下:
int main()
{
 int a[10] = { 2, 7, 34, 54, 12, 5, 19, 33, 88, 23 };
 cout << "原来的数组为" << endl;
 for (int i = 0; i < 10; i++)
 {
  cout << a[i] << " ";
 }
 cout << endl;
 MergeSort(a, 0, 9);
 cout << "排序后的数组为:" << endl;
 for (int i = 0; i < 10; i++)
 {
  cout << a[i] << " ";
 }
 cout << endl;
}

运行结果如下:
在这里插入图片描述
时间复杂度:O(nlogn)
空间复杂度:O(n)


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!