快速排序

快速排序-V1

一、代码实现

1.大致思路

假如有一个数,这个数组自然有序
假如有2个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面,那么这两个数将有序。
假如有3个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
假如有4个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
。。。
假如有n个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
可以发现,从n到1,可以看作一个递归的过程,把排在前面的数和排在后面的数分别看作新的数组进行排列

2.代码

我们直接上代码:

int partition(int*a,int start_index,int end_index){
//    选择第一个元素作为pivot
    int pivot = a[start_index];
//    左右两个索引
    int left = start_index;
    int right = end_index;
    while (left<right){
//        右指针先移动
        while (left<right){
            if(a[right]<pivot) {
                a[left] = a[right];
                break;
            }
            else
                right--;
        }
        while (left<right){
            if(a[left]>pivot){
                a[right] = a[left];
                break;
            }
            else
                left++;
        }
    }
    a[left] = pivot;
    return left;
}
void QuickSort_v1(int *a,int start_index,int end_index){
    if(start_index>end_index)
        return;
    int pivot_index = partition(a,start_index,end_index);
    QuickSort_v1(a,start_index,pivot_index-1);
    QuickSort_v1(a,pivot_index+1,end_index);
}

3.代码讲解

当主函数调用QiuckSort函数,函数将选定一个pivot作为标准对数组排列,并得到pivot最后的索引。
再对索引左右分别进行QuickSrt。
递归停止条件即为左右索引相等,即数组只有一个元素自然有序。

二、复杂度

空间复杂度:O(log_2N)
时间复杂度:O(Nlog_2N)

  • 空间复杂度:由于递归调用会消耗栈资源,对于一个有n个元素的数组,最坏情况需要递归调用log_2N次。
  • 时间复杂度:每次递归调用都会循环N、N/2、N/4、、、1,则总共O(Nlog_2N)
posted @ 2024-03-09 12:09  刘?  阅读(6)  评论(0编辑  收藏  举报