算法学习-插入排序与快速排序

直接插入排序与快速排序

<快速排序>

简单介绍完插入排序:
直接插入排序(Insertion Sort):是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序算法的一般步骤:
1.从第一个元素开始,该元素可以认为已被排序;
2.取出下一个元素,在已经排序的元素序列中从后向前扫描;
3.如果该元素(已排序)大于新元素,将该元素移到下一个位置;
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5.将新元素插入到该位置后,重复2~5

好了。
附上自己巧的代码:

void insertsort(int arr[],int low,int high)
{
    for (int i=low+1;i<=high;++i)
        for (int j=i;arr[j]<arr[j-1]&&j>1;--j)
            swap(arr[j],arr[j-1]);
}

学习自 :

里面有其他几类插入排序的实现方法,也有图解


<快速排序>

前言


  • 为什么要用快速排序?
    因为不让用sort,因为快,能在短时间内处理大规模的数据。
  • 快速排序实现的主要思路:
    1.将待排序的数据放入数组arr中,从arr[low]到arr[high]
    2.如果带排序的元素个数为 0 或 1,排序结束。
    3.从待排序数据中任选一个数据作为分段基准。将它存入变量k
    4.扫描数组里每个数,把它们分为两组,一组数比k小,放右边,一组比k大,放左边,k 放中间。
    5.对前一半和后一半重复上述方法排序。直到 ' 2.'中结束条件满足。

接下来解释代码实现

代码实现


可以把代码分为两步进行,先对数据进行分段。

1.分段
void quicksort(int arr[],int low,int high)
{
    int mid;

    if(low>=high) return;//待分段的元素只有一个或0个,这时候不能再次分段,也就是说对于这一小段来说排序已经完成,是二分到极限时候的"出口"。
    mid=divide(arr,low,high);    //返回分段点 mid ,具体在排序里介绍。
    quicksort(a,low,mid-1);      //排序左一半
    quicksort(a.mid+1,high);    //排序右一半
}
2.排序

对于每一段排序,我们只要选择一个base(基准),把小于这个base的数排序到
base左边,大于base的排序到右边就好,这样当不能继续分段时,这一组数据就排序好了。

int divide (int arr[],int low,int high)
{
    int temp=rand()%(high-low+1)+low;
    swap(arr[low],arr[temp]);
    int base=arr[low];

    bool flag=1;

    while (low!=high)
    {
        switch(flag)
        {
            case 0: if (arr[low]>=base) {arr[high--]=arr[low];flag=1;}
                    else ++low;
                    break;
            case 1: if (arr[high]<base) {arr[low++]=arr[high];flag=0;}
                    else --high;
                    break;
        }

    }
    arr[low]=base;

    return low;
}

没了,洛谷题试了一个下午还是tle,用了随机值还是tle,在排序数目较小时还是tle,对相同值特殊处理也懒得弄了,于是换了思路自己设计了个快排连运行都不成功= =,原因虽然也弄清楚了,但受挫感极大,就一直弄到刚刚。以后用空把注释补一下。

学习自:
C++程序设计|思想与方法(我的教材)

给自己放个小假,这周末至少要把简单dp的原理和回溯法解决,然后针对性刷洛谷题目了吧?(大概

posted @ 2020-11-06 22:28  七铭的魔法师  阅读(392)  评论(0编辑  收藏  举报