首页 > 编程语言 >排序算法集锦

排序算法集锦

时间:2022-10-25 01:12:04浏览次数:46  
标签:arr include 基准值 int 算法 集锦 排序 比较 left

1冒泡排序

思想:相邻数据比较,数组中每两个相邻的数字都要比较,从头比较到末尾确定一个数所在的位置;

如此,N个数,比较NUM=n-1个轮次,每个轮次做n-num次两两比较;

代码如下:(这里为什么改变数组的内容,形参传的不是arr[]的指针,因为形参int arr[] = int *arr,形参虽然是一个副本,是一份拷贝,但是指针所指向的地址是一样的)

//排序算法1 冒泡排序
#include "stdafx.h"
#include"stdio.h"
#include"iostream"
void MPsort(int arr[],int n)
{
    //从小打大,规则:小的放左边,大的放右边。从左到右完成一次比较,最后的一个数就是定住的
    /*
    *arr[]= {1,3,2,5,4,6,8,0}
    第一轮比较 7次,确定最后一个数
    第二轮比较6次,确定倒数第二个数
    第三轮比较5次,确定倒数第三个数
    。。。。
    第N轮比较一次,确认第1,2位的数
    */

    /*数组中有N个数,比较i=n-1轮,每轮次比较 n-i次*/

    for (int i = 0; i < n-1; i++)
    {
        for (int j = 0; j < n - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main()
{
    int arrs[] = {1,4,2,3,6,5,7,0,9,8};
    MPsort(arrs, 10);
    for (int i = 0; i < 10; i++)
    {
        std::cout << arrs[i] << " ";
    }
    return 0;
}

 

 


 2 快速排序

思想:选择基值位置,以及基值,数组中比这个值小的数据都放在这个值的左边,比这个值大的数据,都放在这个值的右边

再分别对这个基准值位置的左侧和右侧做同样的操作,直到只有一个数值(既没有左边也没有右边),停止;

//排序算法1 快速排序,递归
#include "stdafx.h"
#include"stdio.h"
#include"iostream"
/*
找一个基准值,第一趟,比基准值小的数字,都放在基准值的左边,比基准值大的,都放在基准值的右边
对左边的部分进行递归
对右边的部分进行递归
结束的标志:本次比较就只剩下一个数即下标left=right
*/


int OneStepSort(int* arr, int left, int right)
{
    int key_value = arr[left];//取数组的最左边的值为基,比基值小的放在左边,比基值大的放在右边

    while (left <right)
    {
        while (arr[right]> key_value&& left <right)//为什么外层循环已经有了left<right,这里还要写;防止覆盖基值所在位置的内存
        {
            right--;
        }
        arr[left] = arr[right];
        left++;
        while (arr[left] < key_value && left <right )
        {
            left++;
        }
        arr[right] = arr[left];
        right--;

        for (int i = 0; i < 7; i++)
        {
            std::cout << arr[i] << " ";
        }
        std::cout << "\n";
    }
    arr[left] = key_value;
    std::cout <<"----------"<< "\n";
    return left;
}
void Quicksort(int* arr, int left,int right)
{
    int posBaseKay = 0;//基准值的位置
    if (left < right)
    {
        posBaseKay = OneStepSort(arr, left, right);
        Quicksort(arr, left, posBaseKay - 1);
        Quicksort(arr, posBaseKay + 1, right);
    }

    return;

}



int main()
{
    int arrs[] = {9,4,2,3,6,5,7};
    Quicksort(arrs, 0, 6);
    for (int i = 0; i < 7; i++)
    {
        std::cout << arrs[i] << " ";
    }
    return 0;
}

 

标签:arr,include,基准值,int,算法,集锦,排序,比较,left
From: https://www.cnblogs.com/8335IT/p/16823460.html

相关文章

  • 代码随想录Day9 KMP算法
    LeetCode 剑指offer 58 左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符......
  • (算法课)大整数相乘 |向量卷积|多项式相乘| 快速傅里叶变换FFT
    D(1021):很大的ABTimeLimit:1SecMemoryLimit:256MbSubmitted:6Solved:0Description如题,计算AB的值并输出。Input两行,分别代表A和B。A和B......
  • 858 Prim算法求最小生成树
    #include<bits/stdc++.h>usingnamespacestd;constintN=510,INF=0x3f3f3f3f;intn,m;intg[N][N];//储存边intdist[N];//储存点到集合的距离intst[N......
  • 全排列算法的一种
    链接:https://ac.nowcoder.com/acm/problem/16661来源:牛客网题目描述人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理......
  • 贪心算法-455分发饼干
    题目455分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干......
  • HotSpot的算法实现
    枚举根节点由于目前的主流Java虚拟机使用的都是准确式GC,当执行系统停顿下来后,并不需要一个不漏地检查完所有执行上下文和全局的引用位置,虚拟机应当是有办法直接得知哪些地......
  • 垃圾收集算法
    标记-清除算法Mark-Sweep首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。由两个不足:效率问题标记和清除两个过程的效率都不高空间问题标记清除之后......
  • 5.List源码面试题集锦
    1.新建一个ArrayList,现在add一个值,此时数组的大小是多少?下一次扩容前最大可用大小是多少?答:此处数组的大小是1,下一次扩容前最大可用大小是10。因为ArrayList无参构造器初始......
  • ST算法
    ST算法ST算法可以在\(O(N\logN)\)时间的预处理后,以\(O(1)\)的时间复杂度在线回答区间最值问题。状态转移一个序列的子区间个数显然有\(N^2\)个,根据倍增思想,我们......
  • C++算法之旅、01 入门篇
    使用胡凡主编的《算法笔记》教材。题目均为第三章题目。TEST//ProblemAddress#define_CRT_SECURE_NO_WARNINGS#include<cstdio>intmain(){return0;}PAT......