本帖最后由 柳雷 于 2012-7-26 16:21 编辑
快速排序 算法思想: 每趟取一个参照记录,称为枢轴(或支点),先从右向左,逐个记录与枢轴比较,如果逆序则交换,再从左向右,逐个记录与枢轴比较,如果逆序则交换,反复进行,直到左右相遇,结束一趟排序,并将枢轴记录交换到最终所在的位置上。所有大于枢轴的记录记录在右边,小于的在左边,一趟快速排序过程称为一个划分。然后分别对左右两部分进行相同的划分(或分割),得到4部分,再对每部分做相同划分,依次继续下去,直到每个小部分只有一个记录,排序结束。显然,对部分的划分操作完全相同,只是范围需修改,因此可以用递归实现,且最多经过[log 2 (n +1)趟划分,排序结束。 算法实现:分解为两个函数,一趟划分函数,递归调用函数。
以下是快速排序的非递归算法实现 int partition ( RecTypr R[ ] , int low , int high ) { i= low ; j = high ; R[0] = R ; x = R.key ; while ( i < j ) { while ( i < j && R[j].key >= x ) j - - ; if ( i < j ) R = R[j] ; // while ( i < j && R[j].key <= x ) i ++ ; if ( i < j ) R[j] = R ; } R = R[0] ; return i ; } Void quicksort (RecTypr R[ ] , int n ) { typedef struct { int low , high } Node ; Node s[n+1] ; int top = 1 ; s[top].low = 1 ; s[top].high = n ; while ( top > 0 ) { ss = s[top].low ; tt = s[top].high ; top - - ; if ( ss < tt ) { k = partition ( R , ss , tt ) ; if ( k – ss > 1 ) { s[++top].low = ss ; s[top].high = k – 1 ; } if ( k – tt > 1 ) { s[++top].low = k+1 ; S[top].high = tt ; } } } } |