算法四:归并排序
歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;
首先來練習一下將兩個有序的數組,合并成一個有序的數組
void mergeArray(int a[], int n, int b[], int m ,int c[]) {int i ,j , k;i = j = k = 0;while (i < n&&j < m){if (a[i]>b[j]){c[k++] = b[j++];}else{c[k++] = a[i++];}}while (i < n)c[k++] = a[i++];while (j < n)c[k++] = b[j++]; }數組:3,1,2,6,9
將數組從中間位置看成兩個無序的數組,然后再將左右兩個無序的數組,
再將左右兩個無序的數組再從中間分開,有變成兩個無序的數組。。。。
就變成了遞歸的調用。最后再一次合并數組
#include<iostream>using namespace std;void merge(int sore[],int temp[],int start, int mid,int end) {int i = start;int j = mid+1;int k = 0;while(i<=mid&&j<=end){if(sore[i] >sore[j])temp[k++] = sore[j++];elsetemp[k++] = sore[i++];}while(i <= mid)temp[k++] = sore[i++];while(j <= end)temp[k++] = sore[j++];for(i = 0;i<K;i++)sore[start + i] = temp[i]; }void mergeSort(int sore[],int temp[],int start,int end) {if(start < end){int min = (start + end)/2;mergeSort(sore,temp, start,mid);mergeSort(sore,temp,mid+1,end);merge(sore,temp,start,mid,end); } }int main() {int a[5] = {3,1,2,6,9};int b[5];mergeSort(a,b,0,4);for(int i = 0;i < 5;i++){printf("%d ", a[i]);} }?歸并排序的形式就是一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的可以得出它的時間復雜度是O(n*log2n)。
因為要創建一個臨時的數據所以空間復雜度為O(N),復雜度比較復雜,是一種穩定的排序。
轉載于:https://www.cnblogs.com/xiaoma123/p/5220353.html
總結
- 上一篇: 浮点转字符串性能比较
- 下一篇: 有关怎么在不创建新的按钮的前提下改变返回