首页 > 代码库 > 快速排序与递归
快速排序与递归
快速排序是一种效率比较高的算法,算法的思想是取出待排序中的一个元素,想办法将小于他的元素交换到他的左边,大于他的元素交换于他的右侧,然后对左右两侧再分别递归进行上述过程,直到左右两侧的元素只有一个。从而实现了整体的排序。c++实现的代码如下:
//快速排序(递归) template<typename T> void quick_sort(T *arr,int b,int e) { if(b<e) { int i=b,j=e; T x=arr[i]; while(i<j) { while(i<j && arr[j] >= x) --j; if(i<j) { arr[i] = arr[j]; ++i; } while(i<j && arr[i] <= x) ++i; if(i<j) { arr[j] = arr[i]; --j; } } arr[i] = x; quick_sort(arr,b,i-1); quick_sort(arr,i+1,e); } }
但是以递归方式实现快速排序的算法是不稳定的,如果待排序元素本身并不是非常符合算法的设计需求,比如说本身已经是逆序或者正序的,不但排序效率降低,而且导致递归深度迅速增加,甚至堆栈溢出。
虽然在算法处理上采用随机下标或其他手段进行优化,但是也只是概率上减少,而不能杜绝堆栈溢出问题。
因此可以非递归的方式实现该算法类解决堆栈溢出的问题,原理是先以循环的方式进行左侧排序,再以循环的方式进行右侧排序。c++代码如下:
template<typename T> void quick_sort_no_recursive_left(T *arr,int b,int e) { int i,j; loop: if(b<e) { i=b; j=e; T x=arr[i]; while(i<j) { while(i<j && arr[j] >= x) --j; if(i<j) { arr[i] = arr[j]; ++i; } while(i<j && arr[i] <= x) ++i; if(i<j) { arr[j] = arr[i]; --j; } } arr[i] = x; e = i-1; goto loop; } } template<typename T> void quick_sort_no_recursive_right(T *arr,int b,int e) { int i,j; loop: if(b<e) { i=b; j=e; T x=arr[i]; while(i<j) { while(i<j && arr[j] >= x) --j; if(i<j) { arr[i] = arr[j]; ++i; } while(i<j && arr[i] <= x) ++i; if(i<j) { arr[j] = arr[i]; --j; } } arr[i] = x; b = i+1; goto loop; } } //快速排序(非递归) template<typename T> void quick_sort_no_recursive(T *arr,int b,int e) { quick_sort_no_recursive_left(arr,b,e); quick_sort_no_recursive_right(arr,b,e); }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。