首页 > 其他分享 >排序

排序

时间:2024-02-13 17:22:06浏览次数:27  
标签:sort arr idx int while step 排序

一、选择排序

void selection_sort(int* arr, int L, int R)
{
    for (int i = L; i < R; i++)
    {
        int ind = i;
        for (int j = i + 1; j < R; j++)
            if (arr[j] < arr[ind]) ind = j;
        swap(arr[i], arr[ind]);
    }
}

二、插入排序

//普通的插入排序
void insert_sort(int *arr, int L, int R) { for (int i = L + 1; i < R; i++) { int j = i; while (j > L && arr[j] < arr[j - 1]) { swap(arr[j], arr[j - 1]); j--; } } }
//优化后的插入排序(无监督的插入排序)
void unguarded_insert_sort(int *arr, int L, int R)
{
    int idx = L;
    for (int i = L + 1; i < R; i++)
        if (arr[i] < arr[idx]) idx = i;
    while (idx > L)
    {
        swap(arr[idx], arr[idx - 1]);
        idx--;
    }
    for (int i = L + 1; i < R; i++)
    {
        int j = i;
        while (arr[j] < arr[j - 1])
        {
            swap(arr[j], arr[j - 1]);
            j--;
        }
    }
}

 三、希尔排序(分组插入排序)

步骤:

  设计一个【步长】序列;按照步长对序列进行分组,每组采用插入排序;直到执行到步长为1为止。

  下标间隔为步长的为一组,多组分别执行插入排序,步长不断缩小,直到1。

希尔排序的时间复杂度:

  不是固定的,而是与步长序列有关系。

  参考时间复杂度:O(nlogn) ~ O(n^2)

两种增量序列:

  希尔增量序列,最坏O(n^2):n / 2 , n / 4 , n / 8 , n / 16 ...

  Hibbard增量序列,最坏O(n^1.5):1 , 3 , 7 ,  ... , (2^k) - 1.其中(2^k) - 1小于当前数列中的元素数量

#include <bits/stdc++.h>
using namespace std;
void unguarded_insert_sort(int* arr, int L, int R, int step)
{
    int idx = L;
    for (int i = L + step; i < R; i += step)
        if (arr[i] < arr[idx]) idx = i;
    while (idx > L)
    {
        swap(arr[idx], arr[idx - step]);
        idx -= step;
    }
    for (int i = L + 2 * step; i < R; i += step)
    {
        int j = i;
        while (arr[j] < arr[j - step])
        {
            swap(arr[j], arr[j - step]);
            j -= step;
        }
    }
}
void shell_sort(int* arr, int L, int R)
{
    int k = 2, n = R - L, step;
    do{
        step = n / k == 0 ? 1 : n / k;
        for (int i = L; i < L + step; i++)
        {
            unguarded_insert_sort(arr, i, R, step);
        }
        k *= 2;
    } while (step != 1);
    return;
}
void shell_sort_hibbard(int* arr, int L, int R)
{
    int step = 1, n = (R - L);
    while (step <= n / 2) step = step * 2 + 1;
    do
    {
        step /= 2;
        for (int i = L; i < L + step; i++)
        {
            unguarded_insert_sort(arr, i, R, step);
        }
    } while (step != 1);
    return;
}
int main()
{
    int a[110] = {-10, 9 ,77 ,12, 24 ,-500, 12,12,344,12};
    
    // for (int i = 1; i <= 10; i++) cin >> a[i];
    shell_sort(a, 1, 11);
    for (int i = 1; i <= 10; i++) cout << a[i] << ' ';

    cout << '\n';

    int b[110] = { -10, 9 ,77 ,12, 24 ,-500, 12,12,344,12 };
    // for (int i = 1; i <= 10; i++) cin >> a[i];
    shell_sort_hibbard(b, 1, 11);
    for (int i = 1; i <= 10; i++) cout << b[i] << ' ';

    cout << '\n';

    return 0;
}

对于所有基于比较的排序,最优时间复杂度为O(nlogn).

四、冒泡排序及其优化

冒泡排序

void bubble_sort(int* arr, int L, int R)
{
    for (int i = R - 1; i >= L + 1; i--)
    {
        for (int j = L; j < i; j++)
        {
            if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);
        }
    }
    return;
}

优化的冒泡排序

void bettered_bubble_sort(int* arr, int L, int R)
{
    int cnt;
    for (int i = R - 1; i >= L + 1; i--)
    {
        cnt = 0;
        for (int j = L; j < i; j++)
        {
            if (arr[j] <= arr[j + 1]) continue;
            swap(arr[j], arr[j + 1]);
            cnt++;
        }
        if (cnt == 0) break; // 已经有序,不需要再执行冒泡排序
    }
    return;
}

五、快速排序

void quick_sort(int q[],int L,int R)
{
    if(L >= R)
    {
        return;
    }
    int i = L - 1, j = R + 1;
    int x = q[(L + 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(q,L,j);
    quick_sort(q,j + 1,R);
}

 

标签:sort,arr,idx,int,while,step,排序
From: https://www.cnblogs.com/CuberW/p/18014608

相关文章

  • 排序(待填充)
    题目描述为了快速地把修罗王和邪狼从混乱的队伍中找出来,典狱长准备对排队的囚犯进行从小到大的按编号排序,但是他不知道用哪一种排序方法最合适,因此他准备请教前来协助的高级魔法师张琪曼和楚继光。输入共两行,第一行为一个数N(N≤100000),即排队的总人数,第二行为N个数,即每......
  • 【算法】排序
    冒泡排序思想:每一轮确定一个最大值移到最右边。点击查看代码for(inti=n;i>=1;i--){ for(intj=1;j<i;j++){ if(a[j]>a[j+1])swap(a[j],a[j+1]); } }选择排序思想:与冒泡相似。点击查看代码for(inti=n;i>=1;i--){ intmax_id......
  • 各大排序的模板
    1.冒泡排序 1for(i=n;i>=1;--i)2{3for(j=1;j<=i;++j)4{5if(a[j]>a[j+1])6{7swap(a[j],a[j+1]);8}9}10}   2.快速排序1.懒人函数 1sort(a+1,a+n+1);   2.正常的1vo......
  • 补基础题(排序)
    2299--Ultra-QuickSort(poj.org)#include<iostream>//归并排序#include<cstring>usingnamespacestd;typedeflonglongll;constintN=500010;inta[N],tmp[N],ans;voidmerge_(lll,llmid,llr){inti=l,j=mid+1,t=0;while(i<=mid&......
  • chapter3-排序和查找
    1.排序排序就是把一组无序的数据变成有序的过程。对于机试而言,直接使用C++封装好的sort函数就可以了。sort函数内部采用快速排序实现,因此非常高效。使用sort函数,需要引用#include<algorithm>头文件,sort(first_address,last_address,compare)有三个参数,first和last待排序序列的......
  • 力扣递归 两道简单题合成一道中等题之148. 排序链表
    递归归并排序,先找到终点,再合并两个链表 给你链表的头结点 head ,请将其按升序排列并返回排序后的链表。 示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[]/** *Definitionforsingl......
  • 通达信竞开强度排序指标公式源码
    {股票指标}今开:(OPEN/REF(CLOSE,1)-1)*100,NODRAW;创业板:=IF(CODELIKE('300'),1,0);排除一字:=REF((((今开<9.8ANDNOT(创业板))OR(今开<19.5AND创业板))=0),0);涨停创:=IF(C>1.1990*REF(C,1)ANDC=H,1,0);涨停主:=IF(C>1.09*REF(C,1)ANDC=H,1,0);涨停数:=(涨......
  • hexo如何修改文章排序
    hexo默认情况下以编写时间的先后来排序,后写的后出现按照以下方法可为文章添加top属性来排序首先在cmd中输入以下命令首先要切入hexo所在的文件夹,否则生成页面会报错npmuninstallhexo-generator-index--savenpminstallhexo-generator-index-pin-top--save然后在文......
  • Array类 冒泡排序 稀疏数组
    Arrays类数组的工具类java.util.Arrays由于数组对象本身并没有方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作;查看JDK帮助文档Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用”使......
  • 通达信角度雷达寻牛排序指标公式源码副图
    {股票指标}ma5:=MA(C,5);MA10:=MA(C,10);MA30:=MA(C,30);角度5:ATAN((MA5/REF(MA5,1)-1)*100)*180/3.14159,LINETHICK2,COLORYELLOW;角度10:ATAN((MA10/REF(MA10,1)-1)*100)*180/3.14159,LINETHICK2,COLORMAGENTA;角度30:ATAN((MA30/REF(MA30,1)-1)*100)*180/3.14159,LIN......