排序(冒泡,快排,归并)

一,冒泡排序(n^2)

for(int i=2;i<=n;i++)j在前,i在后
    for(int j=1;j<=n-i;j++)
            if(a[j]<a[i])
               swap(a[i],a[j]);

二:快速排序(n*logn~n^2)

#include<iostream>

using namespace std;
int a[(int)1e5+5];
void quick_sort(int q[],int l,int r)//先排序再递归
{
    if(l>=r)return;
    int x=q[l],i=l-1,j=r+1;
    while(i<j)
    {
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j)
            swap(q[i],q[j]);
    }
    quick_sort(a,l,j);
    quick_sort(a,j+1,r);
}
int main ()
{
     int n;
     cin>>n;
     for(int i=1;i<=n;i++)
        cin>>a[i];
     quick_sort(a,1,n);
     for(int i=1;i<=n;i++)
        cout<<a[i]<<‘ ‘;

    return 0;
}

三:归并排序(nlogn)

#include<iostream>

using namespace std;

int a[(int)1e5+5],tmp[(int)1e5+5];
void merge_sort(int q[],int l,int r)
{
    if(l>=r)return ;
    int mid=l+r>>1;
    merge_sort(q,l,mid),merge_sort(q,mid+1,r);
    int k=0,i=l,j=mid+1;
    while(i<=mid&&j<=r)
    if(q[i]<q[j])tmp[k++]=q[i++];
    else tmp[k++]=q[j++];
    while(i<=mid)tmp[k++]=q[i++];
    while(j<=r)tmp[k++]=q[j++];
    for(int i=l,j=0;i<=r;j++,i++)q[i]=tmp[j];//容易出错,tmp数组的范围是从0开始,而q是从l到r
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    merge_sort(a,1,n);
    for(int i=1;i<=n;i++)
        cout<<a[i]<<‘ ‘;
    return 0;
}

原文地址:https://www.cnblogs.com/zwx7616/p/10987588.html

时间: 2024-10-28 20:52:46

排序(冒泡,快排,归并)的相关文章

算法总结——三大排序(快排,计数排序,归并)

快排: 适用条件:方便...只要数字不是很多 复杂度:O(nlogn)  每一层n复杂度,共logn层 原理:利用一个随机数与最后面一个数交换,那么这个随机数就到了最后一位,然后循环,如果前面的数大于最后一个数,那么把这个数放到前面去,经过一次排序之后,前面的数都是大于最后一个的,然后对1到k和k+1到n进行排序,一层一层地下去 模板: #include<cstdio> #include<algorithm> #include<time.h> using namespa

排序 之 快排and归并&lt;时间复杂度&gt;----掌握思想和过程

俗话说:天下武功无坚不破,唯快不破.对于算法当然也是要使用时间最短.占用空间最小的算法来实现了. 注意:我代码里面打的备注仅供参考,建议不要背模板(因为没有固定的模板),可以写一个数列按着代码跑两圈或者把代码改一下输出每次排序后的结果. 总之,师傅领进门,修行在个人.奋斗把!骚年! ※冒泡排序.选择排序:(不稳定,时间复杂度 O(n^2)) 1 #include "cstdio" 2 #include "iostream" 3 using namespace std

单链表的排序(快排和冒泡实现)以及查找中间结点

//快排,冒泡链表排序 #include<iostream> #include<assert.h> using namespace std; template<class T> struct LinkNode { T _data; LinkNode* _next; LinkNode(const T& x) :_data(x) , _next(NULL) {} }; template<class T> class ListNode { //为了安全性

排序 折半,冒泡 快排

折半插入排序: /*********************************************** 折半插入排序 ***********************************************/ #include<stdio.h> #include<string.h> #include<math.h> #include<ctype.h> #include<stdbool.h> #include<stdlib.h

三种排序:快排,归并,堆排

转自:http://www.cnblogs.com/LUO77/p/5798149.html (一)快排 快排考的是最多次的.之前看大神写的算法很简单,思想也很好.就一直用他的思想去思考快排了.挖坑法. 拿走第一个元素作为标兵元素,即挖坑,然后从后面找一个比它小的填坑,然后又形成一个坑,再从前面找一个比标兵大的填坑,又形成一个坑.……最后一个坑填入标兵就好. 然后就是递归了.再在标兵左边排序,右边排序. 1 void QSort(int* num, int start, int end) { 2

排序--QuickSort 快排

Quick の implementation 快排,就像它的名字一定,风一样的快.基本上算是最快的排序算法了.快排的基本思想是选择一个切分的元素.把这个元素排序了.所有这个元素左边的元素都小于这个元素,所有这个元素右边的元素都大于这个元素.接着再把左右2个数组分别排序. 假设你有如下数组 (所有 i  左边的对象都小于 切分对象. 所有 j  右边的对象都大于切分对象 这句话稍后有用 先知道一下) 首先,我们把index = 0 的元素当作切分元素. 从index = 1 的位置开始,找到第一个

NYOJ 8 一种排序【快排】

三级快排,注意题意要求就可以了. 一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现在要求按照一下方式排序(默认排序规则都是从小到大): 1.按照编号从小到大排序 2.对于编号相等的长方形,按照长方形的长排序: 3.如果编号和长都相同,按照长方形的宽排序: 4.如果编号.长.宽都相同,就只保留一个长方形用于排序,删除多余的长方形:最后排好序按照指定

普林斯顿大学算法课 Algorithm Part I Week 3 重复元素排序 - 三路快排 Duplicate Keys

很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路快排就没有这样的问题. 归并排序对重复数据排序的比较在1/2NlgN和NlgN之间 三路快排 目标:将数据分成三个区间(3-way partitioning) lt和gt区间内的元素都和比较元素v相等 lt左边的元素都比v小 gt右边的元素都比v大 性能 三路快排的复杂度比普通快排小,主要取决于数据

排序算法——快排思想

快速排序 1.思想 快速排序将一个数组分成两个数组,再对两个数组独立排序,是个递归算法. 首先随机选出一个切分元素temp(一般为这个数组的第一个元素),将小于temp的数放在temp的左边,将大于temp的数放在temp的右边. 快排和堆排序很像,他们都是将一个数组分成两个子数组,都属于递归算法.但是不同之处在于:快排空间复杂度为o(1),而堆排为o(n), 快排是原地排序,只需要一个很小的辅助栈,时间复杂度为NlogN. 2.代码实现(java) public class Quick {  

排序之快排(JS)

快速排序(Quicksort)是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 详细描述:首先在要排序的序列 a 中选取一个中轴值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于 中轴值,右边的部分 c 的元素 均大于或者等于中轴值,而后通过递归调用快速排序的过程分别对两个部分进行排序