快速排序和归并排序浅解
本文主要讲解基础排序算法中的快速排序和归并排序;这两种排序是非常非常简单的两个小算法案例。闲来被小伙伴问了一下,于是就对这两个算法的内容进行一个讲解。
快速排序
快速排序的背景和性能就不加赘述了,这里就介绍一下,在知道想法之后,一些小伙伴也会困扰和出错的地方。
算法讲解
通过待排序的元素和排序好的序列进行插入,依次进行。
例如:
一般的方法就是依次从右往左遍历,直到找到了适合插入的位置,此时正好大于等于前面一个元素
快排程序示例1
int quickSort2(int arr[],size_t n){
for(int i=0;i != n-1; ++i){
int k = i+1;
int next = arr[i+1];
while(arr[k-1]> next && k>-1){
arr[k] = arr[k-1];
k--;
}
arr[k] = next;
}
return 0;
}
快排的时间复杂度是
为了便于理解对这个一般的方法可以进行一个小小的改良,例如在找到合适的位置插入的过程中,我们使用二分查找,那么二分查找的复杂度
快速排序程序示例
可以在上面k值待插时,使用二分查找的想法; 这里返回待插入的位置。并且保证稳定性。二分查找示例。
int binFind(const int arr[],int start,int end,int key){
int left,right;
int mid;
left=start;
right=end;
while(left<=right){
mid=(left+right)/2;
if(key==arr[mid]) return mid+1;
else if(key < arr[mid]) right=mid-1;
else if(key>arr[mid]) left=mid+1;
}
return left;//没找到这个元素,正好错过去了;那么就返回left的角标
}
归并排序
归并的背景和性能也不加赘述了,这里就介绍一下,常见的困扰地方或者复写容易出错的地方。
算法讲解
通过分治的想法对数列进行排序。
什么叫分治?分治就是把问题分解为一个个非常小的规模,解决之后再合并起来组成全局问题的解。
很显然,归排就是这样的一个经典例子。
归排程序示例
int Merge(int arr[],int tempArr[], int start, int mid, int end){
int i = start, j=mid+1, k = start;
while(i!=mid+1 && j!=end+1){
if(arr[i] > arr[j])
tempArr[k++] = arr[j++];
else
tempArr[k++] = arr[i++];
}
while(i != mid +1)
tempArr[k++] = arr[i++];
while(j != end+1)
tempArr[k++] = arr[j++];
for(i=start; i<=end; i++)
arr[i] = tempArr[i];
return 0;
}
int MergeSort(int arr[], int tempArr[], int start, int end){
int mid;
if(start < end){
mid = (start + end) / 2;
MergeSort(arr, tempArr, start, mid);
MergeSort(arr, tempArr, mid+1, end);
Merge(arr, tempArr, start, mid, end);
}
return 0;
}
上面两种方法可以看到本质上非常接近,至于