标签:strong 结果 adjust 快速排序 tar -- 分治思想 while 算法
算法思想:
分治+挖坑填数
分治思想
将原问题分解成若干规模更小但是结构和原问题相同的子问题。递归求解子问题,然后解出原问题。
快排算法思想
①选择数组中第一个数作为基数,然后设置下标i=first,j=last
②(下标j–)从数组后面找出比第一个数小的数调换到前面
③然后(下标i++)从数组前面找出比基数大的数调换到后面
④如此循环②-③步,直到i=j
结果为以基数分界,左边的数比全部比基数小,右边的数比基数大。结束这次排序。
然后,下次分别排序[first,i-1]和[i+1,last]。这样就将原问题划分成两个与原问题相同的子问题,再次对这两个区间进行快速排序。
算法代码实现:
//分治 void QuickSort(int a[],int first,int last) { if(first < last) { int i = AdjustArray(a,first,last);//以基数分界,对基数左边快排,对基数右边快排 QuickSort(a,first,i-1); QuickSort(a,i+1,last); } } //挖坑填数的代码 int AdjustArray(int a[],int first,int last) { int i = first,j = last; int m = a[first];//以第一个数为基数 while(i<j) { while(i<j && a[j] >= m)//从后往前找小于基数的数 j--; if(i<j) { a[i] = a[j];//将a[j]填到a[i],a[j]变成一个坑 i++; } while(i<j && a[i] < m)//从前往后找比基数大的数 i++; if(i<j) { a[j] = a[i];//将a[i]填到a[j],a[i]变成一个坑 j--; } } a[i] = m;//退出时,i=j,将基数填入坑中 return i; }
标签:strong 结果 adjust 快速排序 tar -- 分治思想 while 算法
原文地址:http://www.cnblogs.com/myworld7/p/7288204.html