1. 程式人生 > >利用遞迴和迴圈實現快速排序

利用遞迴和迴圈實現快速排序

#include <iostream>
#include <queue>
using namespace std;
typedef std::pair<int ,int> queue_data;
queue<queue_data> my_queue;
void swap(int &a,int&b){
    int temp = a;
a = b;
b = temp;
}

int partionArray(int * array,int begin,int end){
    int key = array[end];
int 
i = begin-1; for (int j = i+1;j<end;j++){ if(array[j]<=key){ i=i+1; swap(array[i],array[j]); } } swap(array[i+1],array[end]); return i+1; } void quickSort(int *array,int begin ,int end){ if(begin<end){ int k =partionArray(array ,begin,end); quickSort(array,
begin,k-1); quickSort(array,k+1,end); } } void quickSortUseLoop(int *array,int begin ,int end){ queue_data begin_end= make_pair(begin,end); my_queue.push(begin_end); while (!my_queue.empty()){ queue_data begin_end = my_queue.front(); my_queue.pop(); int k = partionArray(array,begin_end.first
,begin_end.second); if(begin_end.first<k-1) { my_queue.push(make_pair(begin_end.first, k - 1)); } if(k+1<begin_end.second){ my_queue.push(make_pair(k+1,begin_end.second)); } } } int main(){ int array_new[]={-1,3,2,6,7,5,9}; int array[]={-1,3,2,6,7,5,9}; int length = sizeof(array)/ sizeof(int); quickSort(array,0,length-1); std::cout << "------------ recursion function ----------------"<<std::endl; for(auto i:array){ std::cout << " "<<i<<std::endl; } std::cout << "------------ loop function ----------------"<<std::endl; int length_new = sizeof(array_new)/ sizeof(int); quickSortUseLoop(array_new,0,length_new-1); for(auto i:array_new){ std::cout << " "<<i<<std::endl; } } 迴圈與遞迴方式的快排思想一致,遞迴時,先將陣列分成兩個部分,之後分別再對這兩個部分遞迴排序。for迴圈就是將分組的前半部和後半部的起始和結束位置記錄下來,再進行分組。