排序——快速排序算法

快速排序由C. A. R. Hoare在1962年提出。

它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序是对冒泡排序的一种改进。

这样说可能不是很形象,不是很好理解,我举个例子说明一下:有以下数列:

4 7 2 1 5 8 6 3  第一次选择4为基准,i=left=0,j=right=7,key=4,从后往前遍历,3 < 4,互换位置。i=0,j=7,key=4;

3 7 2 1 5 8 6 4 到第二个循环,3<4,因此i = 1,7>4,互换位置。i=1,j=7,key=4;

3 4 2 1 5 8 6 7 转到循环一,1<4,互换位置。i=1,j=3,key=4;

3 1 2 4 5 8 6 7 循环二,循环满足条件,直到i==j,跳出大循环,递归调用,i = 3处分开成两个数列。将key=4固定。

3 1 2               基准为3,i=left=0,j=right=2,key=3,从后往前遍历,2 < 3,互换位置。i=0,j=2,key=3;

2 1 3      到第二循环,结束。key=3固定。

2 1          基准为2,i=left=0,j=right=1,key=2,从后往前遍历,1 < 2,互换位置。i=0,j=1,key=2;

1 2          到第二循环,结束。

5 8 6 7      基准为5,i=left=4,j=right=7,key=5,从后往前遍历,结束。key=5固定;

8 6 7              基准为8,i=left=5,j=right=7,key=8,从后往前遍历,7 < 8,互换位置。i=5,j=7,key=8;

7 6 8       到第二循环,结束。key=8固定。

7 6        基准为7,i=left=5,j=right=6,key=7,从后往前遍历,6 < 7,互换位置。i=5,j=6,key=7;

6 7      到第二循环,结束。

以上为快排的实现过程(如有疑问,还望指出)

代码:(C语言):

void qSort(int num[],int left,int right){//第一个和最后一个元素
    if(left < right){
        int i=left, j=right;
        int key = num[left];//将第一个元素当作基准
        while(i<j){
            while(i<j && num[j]>=key) j--;
            int t=num[i]; num[i]=num[j]; num[j]=t;
            while(i<j && num[i]<=key) i++;
            t=num[i]; num[i]=num[j]; num[j]=t;
        }//固定key在数列中的位置不变,以key为界线递归调用重新排序。
        qSort(num,left,i-1);
        qSort(num,i+1,right);
    }
}

 Java语言:

public static void qSort(int num[],int left,int right){
        if(left>=right){
            return ;
        }
        int i=left, j=right, key=num[left];
        while(i < j){
            while(i<j && key<=num[j]){    j--;}
            num[i] = num[j];
            while(i<j && key>num[i]){    i++;}
            num[j] = num[i];
        }
        num[j] = key;
        qSort(num,left,i-1);
        qSort(num,i+1,right);
    }

 

转载于:https://www.cnblogs.com/hey-man/p/6838391.html

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
### 快速排序分治算法实现与原理 快速排序是一种基于分治策略的经典排序算法,其核心思想是通过选取一个基准值(Pivot),将待排序数组划分为两个子数组,使得左侧子数组的元素均不大于基准值,右侧子数组的元素均不小于基准值。随后递归地对这两个子数组进行相同的操作,直到每个子数组只有一个元素或为空为止。 #### 1. 快速排序的核心思想 快速排序的关键在于如何有效地划分数组以及递归处理子数组的过程。具体来说,快速排序可以分解为以下几个阶段[^2]: - **选择基准值 (Pivot)**:通常可以选择第一个元素、最后一个元素或者随机选择某个元素作为基准值。 - **分区操作 (Partition)**:重新排列数组,使所有小于基准值的元素位于左边,所有大于基准值的元素位于右边,并返回基准值的位置索引。 - **递归排序**:对基准值两侧的子数组分别递归应用相同的分区和排序逻辑。 最终的结果是,当所有的子数组都被排序完成后,整个数组也变得有序。 #### 2. 时间复杂度分析 快速排序的时间性能取决于每次分割后的子数组大小分布情况。理想情况下,如果每次都能均匀地将数组一分为二,则时间复杂度为 \( O(N \log N) \)[^4]。然而,在最坏的情况下(例如输入数组已经完全逆序或顺序排列),可能会退化至线性平方级的时间复杂度 \( O(N^2) \)。 #### 3. 空间复杂度 由于快速排序采用的是原地排序方式,因此不需要额外分配大量的存储空间来保存临时副本。除了用于记录递归调用栈的空间外,几乎无需其他辅助内存资源消耗。对于平均情况而言,递归深度大约为 \( \log N \),故总体空间复杂度接近于 \( O(\log N) \)[^2]。 #### 4. Python 实现代码示例 以下是使用Python编写的快速排序函数的一个简单版本: ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr)//2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) # 测试例子 example_array = [3,6,8,10,1,2,1] print("Sorted array:", quick_sort(example_array)) ``` 此段程序展示了基本的功能框架,实际工程环境中可能还需要考虑更多边界条件及优化措施。 #### 5. 不稳定性的讨论 值得注意的一点是,尽管快速排序效率很高,但它并非总是稳定的排序方法。所谓稳定性是指相等键值的数据项在排序之后能够保持原有的相对次序不变。而因为我们在上面给出的例子中直接丢弃了关于位置的信息,所以在某些特定场景下可能导致原本相邻重复数值被打散重组从而破坏原有秩序关系[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值