排序_快速排序算法

/*
每次以数组第一个数为基数,从数组两端往中间找,小于基数的数放在数组的左边,大于它的数放在数组的右边,当i == j的时候,
查找结束,将基数赋值到这个位置,这个数在数组中的位置就是这个,确定了。然后从这个数的左边和右边开始递归,直到所有的数
都排完序。
时间复杂度:nlog2n(最好,平均)、n2(最坏)
*/
#include<cstdio>
#include<iostream>
using namespace std;
void sort(int ri[],int l,int r)
{
    if (l < r)
    {
        int i = l , j = r , x = ri[l];//x = ri[l],不是 x = ri[1]
        while (i < j) // i == j 的时候,这次查找就结束了
        {
            // while里面的循环都必须保证i < j
            while (i < j && ri[j] >= x)
            {
                --j;
            }
            if (i < j)//如果没有这条语句直接赋值的话,倘若上面while结束循环的条件是i = j,那么接下来的赋值就会出错
            {
                ri[i++] = ri[j];
            }
            while (i < j && ri[i] < x)
            {
                ++i;
            }
            if (i < j)
            {
                ri[j--] = ri[i];
            }
        }
        ri[i] = x; // 将基数赋值到这个位置
        sort(ri,l,i-1); // 从i位置的左边开始递归,由于i位置的数已经确定,所以本次递归右边的数是从i-1开始的
        sort(ri,i+1,r); // 同上
    }
    return ;
}
int main()
{
    int i,n,ri[100];
    while (~scanf("%d",&n))
    {
        for (i = 0; i < n; ++i)
            scanf("%d",&ri[i]);
        sort(ri,0,n-1);
        for (i = 0; i < n; ++i)
            printf("%d ",ri[i]);
        printf("\n");
    }
    return 0;
}

时间: 2024-07-31 17:51:53

排序_快速排序算法的相关文章

【排序】快速排序算法

特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 快速排序介绍 快速排序算法相较于插入.冒泡.选择排序来说而言要稍微复杂些.其主要用的是分治思想,将问题划分为更小的子问题来解决.因此,快速排序的思想其实很简单.在(目前的)时间复杂度为  的排序算法中,快速排序的系数是最小的.因此,在平均情况下,快速排序算法是被认为最快的一种排序算法(要不怎么称之为快速排序呢?). 快速排序算法在大数据量情况下,实践证明在平均情况下的排序算法

数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法

快速排序算法属于"交换类"的排序,它的效率主要跟数据分布是否对称有关. 升序排序: /** * 快速排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { if(data == null || data.length <= 1){ return; } partitionSortByAsc(data, 0, data.length -

八大排序之快速排序算法-python实现

快排就是折中时间和空间的一个算法,可以说是较为高效的算法,平时用用他没啥大问题. 自己也看到个比较形象生动的例子,为了让大家能够看的比较清楚,我就直接转过来给大家看了哈!但是我使用python实现的: 注意以下除了实现代码,其他为转发,详见页末! 假设我们现在对"6  1  2 7  9  3  4  5 10  8"这个10个数进行排序.首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了).为了方便,就让第一个数6作为基准数

排序_归并排序算法

/*将数组中的数不断的递归,直到只剩一个数为止(因为一个数自然是有序的),然后再回溯排序,另外再用一个数组T存储当前排好序的数,然后再赋值给原数组A,直到所有的数都排好了序.时间复杂度:nlog2n(最好,最坏,平均)*/#include<cstdio>#include<iostream>using namespace std;void merge_sort(int *A,int x,int y,int *T) //A是原数组,x是第一个数的位置,y-x 是数组中元素的个数,T是临

C语言学习_排序_快速排序

passport.baidu.com/?business&un=%E9%AB%98%E5%B7%9E%E5%AD%A6%E5%A6%B9%E6%83%85%E4%B8%80%E5%A4%9C#0 passport.baidu.com/?business&un=%E9%AB%98%E5%B7%9E%E5%B0%8F%E5%A7%90%E6%83%85%E4%B8%80%E5%A4%9C#0 passport.baidu.com/?business&un=%E9%AB%98%E5%B7

排序——选择排序、快速排序

知识点总结报告 知识点: 选择排序 (原理)基本思想:第i趟排序开始时,当前有序区和无序区分别为R[0...i-1]和R[i..n-1](0<=i<n-1),该趟排序是从当前无序区中选出关键字最小的元素R[k],将它与无序区的第一个元素R[i]交换,使R[0..i]和R[i+1..n-1]分别变为新的有序区和新的无序区. 因为每趟排序均使有序区中增加了一个元素,且有序区中元素的关键字均不大于无序区中元素的关键字,即第i趟排序之后R[0..i]的所有关键字均小于等于R[i+1..n-1]中的所有

排序算法之 Java简单快速排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class SimpleQuick { public int[] sort(int[] arr,int left,int right){ if ( arr == null || a

排序算法--快速排序算法解析

一.快速排序算法思路 ①.取待排序列表的第一个元素p,通过归位算法,挪移他到列表中正确的位置. ②.列表被元素p分成两部分,左边都比元素p小,右边都比元素p大. ③.通过递归,在两部分,重复1.2步骤,直至列表有序. 归位算法动画演示: 二.快速排序算法代码示例 1 def partition(l,left,right):#归位算法 2 temp = l[left] #保存归位元素 3 while left <right: 4 while l[right]>=temp and left<

排序——快速排序算法

快速排序的思想在程序中经常用到,虽然C++给出了快速排序的函数调用,但是很多程序可能需要自己写排序过程,快速排序就会被用到,以下是快速排序算法: 快速排序时间复杂度是O(nlog(n)),在数据有序的情况下最耗时 (程序输入如果使用scanf_s则编译器为vs2013) #include<stdio.h> #include<stdlib.h> #define  MAXSIZE  1<<9 typedef struct { int key; }RedType; typed