sort快排的实现

2020-05-07  本文已影响0人  与时间共舞

快速排序的基本实现

快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:
1、从数列中取出一个数作为基准数。
2、将数组进行划分,将比基数大的元素都移至基准数的右边,将小于等于基准数的元素都移至基准数的左边。
3、再对左右的子区间重复第二步的划分操作,直至每一个子区间只有一个元素。

快速排序实现一:

#include <iostream>
using namespace std;
void quick_sort(int arr[], int left,int right);
int main(){
    int n;
    cin>>n;
    int a[n];
    for(int i=0; i<n; i++){
        cin>>a[i];
    }
    quick_sort(a,0,n-1);
    for(int i=0; i<n; i++){
        cout<<a[i]<<"\t";
    }

    return 0;
}
//快排
int partition(int arr[], int left,int right){
    //找基准数 划分(分治)
    int i=left + 1;
    int j=right;
    int temp = arr[left];
    while(i<=j){
        while(arr[i]<temp){
            i++;
        }
        while(arr[j]>temp){
            j--;
        }
        if(i<j){
            swap(arr[i],arr[j]);
            i++;
            j--;
        }else{
            i++;
        }
    }
    swap(arr[j],arr[left]); 
    return j;
}

void quick_sort(int arr[], int left, int right){
    if(left>right){
        return;
    }
    int j = partition(arr,left,right);
    quick_sort(arr,left,j-1);
    quick_sort(arr,j+1,right);  
}

快速排序 实现方法二:

#include <iostream>
using namespace std;
//声明 Quick_sort快排方法 
void Quick_sort(int arr[], int start, int last);
int main(){
    int n;
    cin>>n;
    int a[n];
    for(int i=0; i<n; i++){
        cin>>a[i];
    }
    Quick_sort(a,0,n-1);
    for(int i=0; i<n; i++){
        cout<<a[i]<<"\t";
    }

    return 0;
}

void Quick_sort(int arr[], int start, int last){
    int i = start;
    int j = last;
    int temp = arr[i];
    if(i<j){
        while(i<j){
            while(i<j && arr[j]>=temp){
                j--;
            }
            if(i<j){
                arr[i] = arr[j];
                i++;
            }
            while(i<j && temp>arr[i]){
                i++;
            }
            if(i<j){
                arr[j] = arr[i];
                j--;
            }
        }
        //把基准数放到i位置
        arr[i] = temp;
        //递归方法
        Quick_sort(arr,start,i-1);
        Quick_sort(arr,i+1,last); 
    }   
}

快排的时间复杂度

快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。

快速排序的稳定性

快速排序是不稳定的算法。
算法稳定性:假设在数列中存在啊a[i]=a[j],若在排序之前,啊a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面,则说这个排序算法是稳定的。

上一篇下一篇

猜你喜欢

热点阅读