思想:多次将两个或两个以上的有序表合并成一个新的有序表。
算法时间复杂度
最好的情况下:一趟归并需要n次,总共需要logN次,因此为O(N*logN)
最坏的情况下,接近于平均情况下,为O(N*logN)
说明:对长度为n的文件,需进行logN 趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。
稳定性
归并排序最大的特色就是它是一种稳定的排序算法。归并过程中是不会改变元素的相对位置的。
缺点是,它需要O(n)的额外空间。但是很适合于多链表排序。(可以去看我博客中两个排序链表的合并)
//将【first...mid】【mid....last】两个有序数组合并 void mergearray(int data[], int first, int mid, int last, int temp[]) { int arr1 = first; //指向第一个数组的开头 int arr2 = mid+1;//指向第二个数组的开头 int endofarr1 = mid;//指向第一个数组的结尾 int endofarr2 = last;//指向第二个数组的结尾 int k=0;//temp数组指针 while( arr1 <= endofarr1 && arr2 <= endofarr2) { if( data[arr1] < data[arr2] ) { temp[k] = data[arr1]; ++k; ++arr1; //简写成temp[k++] = data[arr1++]; } else temp[k++] = data[arr2++]; } //如果arr2数组先遍历完成,就继续遍历完arr1 while(arr1 <= endofarr1) temp[k++] = data[arr1++]; //如果arr1数组先遍历完成,就继续遍历完arr2 while(arr2 <= endofarr2) temp[k++] = data[arr2++]; for(int i=0; i< k ; ++i) { data[first+i] = temp[i]; //注意这里要把first加进去 } } void mergesort(int data[], int first, int last, int temp[]) { if( first < last) { int mid = (first+last)/2; mergesort(data,first,mid,temp); mergesort(data,mid+1,last,temp); mergearray(data,first,mid,last,temp); } } bool Mergesort(int data[], int length) { if(data == NULL || length <=0 ) return false; int * temp = new int[length]; if( temp == NULL ) return false; mergesort(data,0,length-1,temp); delete[] temp; return true; }