快速排序也利用了分治的思想,跟归并排序排序相比减少了交换次数
int partition(int a[],int p,int r) { int x = a[r]; int i = p-1; int j; for(j = p;j<r;j++) { if(a[j]<=x) { i++; int t = a[i]; a[i] = a[j]; a[j] = t; } } int tmp = a[i+1]; a[i+1] = a[r]; a[r] = tmp; return i+1; } void quicksort(int a[],int p,int r) { if(p<r) { int q = partition(a, p, r); quicksort(a, p, q-1); quicksort(a, q+1, r); } }
为什么要引入随机化快速排序。这个问题从算法的根本出发点来说,就是为了效率的提升。在一般的快排中,重要的是选择主元对数组进行划分。如果原序列是有序的,那么最坏的情况下时间复杂度为O(n2).而随机化快速排序能将时间复杂度的期望控制在O(nlgn).与非随机化快排相比,利用随机数生成器随机产生了数作为主元。
int partition(int a[],int p,int r) { srand(unsigned(time(0))); int index = rand()%(r-p) + p; int x =a[r]; a[r] = a[index]; a[index] = x; int i = p - 1; int provit = a[r]; for(int j = p;j < r;j++) { if(a[j]<=provit) { i++; int t = a[j]; a[j] = a[i]; a[i] = t; } } int t = a[r]; a[r] = a[i+1]; a[i+1] = t; return i+1; }