快速排序

71 阅读2分钟

快速排序 快速排序基本思想

先从数列中取出一个元素作为基准数; 扫描数列,将比基准数小的元素全部放到它的左边,大于或等于基准数的元素全部放到它的右边,得到左右两个区间; 在对左右区间重复第二步,直达区间少于两个元素; 快速排序代码实现 void swap(int *x,int *y) { int itmp=*x; *x=*y; *y=itmp; } void quicksort(int *arr,unsigned int len) { if(len<2) return ; int tmp = arr[0]; int left = 0,right = len - 1; while(left<right) { while (arr[right] >= tmp && left < right) right--; swap(&(arr[left]),&(arr[right])); while (arr[left]<tmp&&left<right) left++; swap(&(arr[right]),&(arr[left])); } arr[left] = tmp; quicksort(arr,left); quicksort(arr+right+1,len - right -1); }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 快速排序的优化 采用更合理的基准数(中心轴),减少递归的深度。从数列中选取多个数,取中间数 结合插入排序,区间在10个元素之内采用插入排序,效率更高。 归并排序 本节介绍一种不同于插入排序和选择排序的排序方法——归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表。

例如对于含有 n 个记录的无序表,首先默认表中每个记录各为一个有序表(只不过表的长度都为 1),然后进行两两合并,使 n 个有序表变为 ⌈n/2⌉ 个长度为 2 或者 1 的有序表(例如 4 个小有序表合并为 2 个大的有序表),通过不断地进行两两合并,直到得到一个长度为 n 的有序表为止。这种归并排序方法称为:2-路归并排序。

例如对无序表{49,38,65,97,76,13,27}进行 2-路归并排序的过程如图 1 所示:

归并排序代码实现 #include<bits/stdc++.h> using namespace std; const int MAX = 100005; typedef long long ll; ll a[MAX] = {5,4,4,7,4,3,2,1,1},b[MAX];

void merge(ll l,ll mid,ll r){ int i = l,j = mid + 1; int tmp = 0; while (i<=mid&&j<=r){ if(a[i]>a[j]) b[tmp++] = a[j++]; else b[tmp++] = a[i++]; } while (i<=mid) b[tmp++] = a[i++]; while (j<=r)b[tmp++] = a[j++]; for( i = 0 ;i< tmp ;i++){ a[l+i] = b[i]; } } void mergeSort(ll l,ll r){ if(l<r){ int mid = (l + r) / 2; mergeSort(l,mid); mergeSort(mid+1,r); merge(l,mid,r); } } int main(){ mergeSort(0,8); for(int i = 0;i<9;i++){ cout<<a[i]<<" "; } }

原文链接:blog.csdn.net/weixin_5980…