利用递归和循环实现快速排序

#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循环就是将分组的前半部和后半部的起始和结束位置记录下来,再进行分组。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现快速排序算法的代码: ```c #include <stdio.h> void quick_sort(int arr[], int left, int right) { if (left < right) { int i = left, j = right, pivot = arr[left]; while (i < j) { while (i < j && arr[j] >= pivot) { j--; } if (i < j) { arr[i++] = arr[j]; } while (i < j && arr[i] < pivot) { i++; } if (i < j) { arr[j--] = arr[i]; } } arr[i] = pivot; quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right); } } int main() { int arr[] = {5, 3, 8, 4, 2, 7, 1, 10}; int n = sizeof(arr) / sizeof(arr[0]); quick_sort(arr, 0, n - 1); printf("Sorted array: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 在这个实现中,我们定义了一个 `quick_sort` 函数,它采用递归的方式对数组进行排序。函数的参数 `left` 和 `right` 表示要排序的数组的左右边界。如果左边界小于右边界,就进行排序操作。在排序过程中,我们使用第一个元素作为枢轴(pivot),然后将数组分成两个部分:小于枢轴的元素和大于枢轴的元素。在这个实现中,我们使用两个指针 `i` 和 `j` 来分别扫描数组。`i` 指针从左边开始扫描,如果扫描到的元素小于枢轴,就将 `i` 指针向右移动。`j` 指针从右边开始扫描,如果扫描到的元素大于等于枢轴,就将 `j` 指针向左移动。当 `i` 和 `j` 指针都停止移动时,交换 `arr[i]` 和 `arr[j]`。最后,将枢轴放到正确的位置上,然后递归对左右两个部分进行排序。 在 `main` 函数中,我们定义一个数组并调用 `quick_sort` 函数对它进行排序。最后,我们使用循环遍历数组并打印出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值