排序算法整理

news2024/11/25 12:49:38

在这里插入图片描述

快速排序

C实现

void fastStore(int *a, int start, int end){
    
	if(start>=end)
		return ;
	
	int left=start;
	int right=end;
	int temp=a[left];//设置基准值temp
	
	while(left < right)		//左指针的位置一定小于右指针的位置
	{
		while(a[right]>temp && left < right)	
							//左指针要在右指针的左面
		{
			right--;
		}
		a[left] = a[right];
		left++;
		
		while(a[left] < temp && left < right){
			left++;
		}
		a[right] = a[left];
		right--;
		a[left] = temp;
	}
  
    fastSort(a,start,left-1);
    fastSort(a,right+1,end);
} 
void FastSort(int *a,int start,int end)
{
	if(start>=end)//递归条件
	{
		return; //跳出递归
	}
	//初始化左右指针
	int left = start;
	int right = end;
	int temp = a[left]; 			//基准值
	while(left < right)
	{
		while(a[right]>temp && left < right)
		{
			right--;
		}
		a[left] = a[right];	//将右指针的值赋给左指针
		left++;
		while(a[left]<temp && left<right)
		{
			left++;
		}
		a[right] = a[left];
        right--;
        a[left] = temp;	//把基准值赋给左指针
        
	}
	FastSort(a,start, left-1);	//左面
	FastSort(a,right+1, end);	//右面
}

C++实现

#include<iostream>
 
//快排具体实现
template<typename T>
void showNum(T *num,int len)
{
    for (int j = 0; j < len; j++)
    {
        std::cout<<num[j]<<" ";
    }
    std::cout<<std::endl;
}
template<typename T>
int part(T* arr, int left, int right)  //划分函数
{
    int i = left; 
    int j = right;
    T fidValue = arr[left];
    while (i < j)
	{
		while (i<j && arr[j]>fidValue) //从右向左开始找一个 小于等于 pivot的数值
		{
			j--;
		}
		if (i < j)
		{
			std::swap(arr[i++], arr[j]);  //r[i]和r[j]交换后 i 向右移动一位
		}
		while (i < j && arr[i] <= fidValue) //从左向右开始找一个 大于 pivot的数值
		{
			i++;
		}
		if (i < j)
		{
			std::swap(arr[i], arr[j--]);  //r[i]和r[j]交换后 i 向左移动一位
		}
	}
	return i;  //返回最终划分完成后基准元素所在的位置
}

template<typename T>
void fastSort(T *arr,int left,int right)
{
    int mid;
	if (left < right)
	{
		mid = part(arr, left, right);  // 返回基准元素位置
		fastSort(arr, left, mid - 1); // 左区间递归快速排序
		fastSort(arr, mid+1, right); // 右区间递归快速排序
	}
}
template<typename T>
void Sort(T *num,int len)
{
    fastSort(num,0,len-1);
}

int main()
{
    int num[] = {4,2,1,6,3,8,12,0,34};
    Sort<int>(num,sizeof(num)/sizeof(num[0]));
    showNum<int>(num,sizeof(num)/sizeof(num[0]));

    std::string str[]={"w ","c ","d ","a "};
	Sort<std::string>(str,sizeof(str)/sizeof(str[0]));
	showNum<std::string>(str,sizeof(str)/sizeof(str[0]));

    return 0;
}

插入排序

#include<stdio.h>

//显示数组
void ShowArray(int *num, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ",num[i]);
    }
    printf("\n");
}
//插入排序: 与冒泡相反,在开始遍历数据时,就进行数据的排序,遍历后的数据实现有序
/***
 * 具体实现:
 * 对数据进行遍历,对遍历到某位置的数据,
 * 通过临时值,实现与该位置之前的所有数据的比较,   
 * (因为在循环中,所以,该位置之前的所有数据是有序的)
 * 当 该值 大于前一位置的值时,即可,跳出比较循环,并将temp赋给当前位置j
*/
void InsertSort(int *num, int len)
{
    for(int i=0;i<len;i++)
    {
        int temp=num[i];    //一个临时值
        int j=i;
        for(;j>0;j--){
            if(temp<num[j-1]){  //和i位置之前的所有数据进行比较
                num[j]=num[j-1];	//把大值放在右面
            }
            else{   //temp>num[j-1], 即temp大于前一个数
                break;	//跳出第二层循环,并将当前的j位置的数值置为temp
            }
        }
        num[j]=temp;
    }  
}
 
int main()
{
    int num[]={2,7,1,4,8,3,9};
    InsertSort(num,sizeof(num)/sizeof(num[0])-1);
    ShowArray(num,sizeof(num)/sizeof(num[0]));
    return 0;
}

冒泡排序

#include<stdio.h>

//显示数组
void ShowArray(int *num, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ",num[i]);
    }
    printf("\n");
}
//冒泡排序
/**
 * 算法思想:
 * 通过循环每次比较,将最大值放在最后
 * 这样,每次遍历循环的数据个数都会-1
 * 最后一个数据无需比较,默认最小值
*/
void BubbleSort(int *num,int size)
{
    //遍历,找寻最大值
    for (int i = 0; i < size-1; i++)    //最后一个数无需比较,自动上浮
    {   
        for (int j = 0; j <size-i-1; j++)   //size-i-1:是因为,前i个数据已经排成有序队列,无需再次比较: 
        {
            if (num[j]>num[j+1])    //每一轮比较的最大值都会上浮,即可排除该值,所以-i
            {
                int tmp = num[j];
                num[j]=num[j+1];
                num[j+1] = tmp;
            }
        }
    }
}

 
int main()
{
    int num[]={2,7,1,4,8,3,9};
    BubbleSort(num,sizeof(num)/sizeof(num[0]));
    ShowArray(num,sizeof(num)/sizeof(num[0]));
    return 0;
}

选择排序

#include<stdio.h>

//显示数组
void ShowArray(int *num, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ",num[i]);
    }
    printf("\n");
}
//选择排序 : 
/**
 * 算法思想:
 * 选取左位置的数据为一最小值(或者最大值),与数据进行比较,找到最小值或最大值
 * 与当前的i位置的数据进行交换,保证遍历过的数据是有序的
*/
void ChooseSort(int *num, int len)
{
    int minnum = 0;
    for(int i=0;i<len;i++)
    {
        minnum = num[i];
        for (int j = i+1; j < len; j++)
        {
            if (num[j]<minnum)  //查找最小值,将当前位置的值与num[j]交换
            {
                int temp = minnum;  //选用下标,效率更高,将会减少了交换次数
                minnum = num[j];
                num[j] = temp;
            }
        }
        num[i]=minnum;        
    }  
}
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void ChooseSort2(int *num , int len)
{
    int i, j, minnum;
    for(i = 0; i < len; i++)
    {
        minnum = i; //下标
        for(j = i+1; j<len; j++)
        {
            if (num[j]<num[minnum]) //查找最小值的下标
                minnum = j;
        }
        swap(&num[minnum],&num[i]);
    }
}
 
int main()
{
    int num[]={2,7,1,4,8,3,9};
    ChooseSort2(num,sizeof(num)/sizeof(num[0])-1);
    ShowArray(num,sizeof(num)/sizeof(num[0]));
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1400293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VRRP协议负载分担

VRRP流量负载分担 VRRP负载分担与VRRP主备备份的基本原理和报文协商过程都是相同的。同样对于每一个VRRP备份组,都包含一个Master设备和若干Backup设备。与主备备份方式不同点在于:负载分担方式需要建立多个VRRP备份组,各备份组的Master设备可以不同;同一台VRRP设备可以加…

linux(七):I2C(touch screen)

本文主要探讨210触摸屏驱动相关知识。 I2C子系统 i2c子系统组成部分:I2C核心,I2C总线驱动,I2C设备驱动 I2C核心&#xff1a;I2C总线驱动和设备驱动注册注销方法 I2C总线驱动&#xff1a;I2C适配器(I2C控制器)控制,用于I2C读写时序(I2C_adapter、i2c_a…

树的一些经典 Oj题 讲解

关于树的遍历 先序遍历 我们知道 树的遍历有 前序遍历 中序遍历 后序遍历 然后我们如果用递归的方式去解决&#xff0c;对我们来说应该是轻而易举的吧&#xff01;那我们今天要讲用迭代&#xff08;非递归&#xff09;实现 树的相关遍历 首先呢 我们得知道 迭代解法 本质上也…

微信小程序(九)轮播图

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1.轮播容器的基本属性 2.轮播图片的尺寸处理 index.wxml <view class"navs"><text class"active">精选</text><text>手机</text><text>食品</text><…

第6章 现代通信技术

文章目录 6.1 图像与多媒体通信6.1.1 图像通信6.1.2 多媒体通信技术1、多媒体通信概念2、多媒体通信的组成3、多媒体通信的业务分类4、实用化的多媒体通信系统类型5、多媒体通信应用系统&#xff08;1&#xff09;多媒体会议电视系统&#xff08;2&#xff09;IPTV 6.2 移动通信…

C++——函数

1&#xff0c;概述 函数的作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个模块实现特定的功能。 2&#xff0c;函数的定义 函数的定义一般主要有五个步骤&#xff1a; 1&#xff…

69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey

文章目录 一&#xff1a;简介二&#xff1a;Go标准库compress/gzip包介绍ConstantsVariablestype Headertype Reader 三&#xff1a;代码实践1、压缩与解压工具包2、单元测试3、为何压缩后还要用base64编码 代码地址&#xff1a; https://gitee.com/lymgoforIT/golang-trick/t…

USB-C接口给显示器带来怎样的变化?

随着科技的不断发展&#xff0c;Type-C接口已经成为现代电子设备中常见的接口标准。它不仅可以提供高速的数据传输&#xff0c;还可以实现快速充电和视频传输等功能。因此&#xff0c;使用Type-C接口的显示器方案也受到了广泛的关注。本文将介绍Type-C接口显示器的优势、应用场…

基于C++11的数据库连接池【C++/数据库/多线程/MySQL】

一、概述 概述&#xff1a;数据库连接池可提前把多个数据库连接建立起来&#xff0c;然后把它放到一个池子里边&#xff0c;就是放到一个容器里边进行维护。这样的话就能够避免数据库连接的频繁的创建和销毁&#xff0c;从而提高程序的效率。线程池其实也是同样的思路&#xf…

Mysql 编译安装部署

Mysql 编译安装部署 环境&#xff1a; 172.20.26.198&#xff08;Centos7.6&#xff09; 源码安装Mysql-5.7 大概步骤如下&#xff1a; 1、上传mysql-5.7.28.tar.gz 、boost_1_59_0.tar 到/usr/src 目录下 2、安装依赖 3、cmake 4、make && make install 5、…

【React】组件性能优化、高阶组件

文章目录 React性能优化SCUReact更新机制keys的优化render函数被调用shouldComponentUpdatePureComponentshallowEqual方法高阶组件memo 获取DOM方式refs如何使用refref的类型 受控和非受控组件认识受控组件非受控组件 React的高阶组件认识高阶函数高阶组件的定义应用一 – pro…

Ubuntu20.4 Mono C# gtk 编程习练笔记(三)

Mono对gtk做了很努力的封装&#xff0c;即便如此仍然与System.Windows.Form中的控件操作方法有许多差异&#xff0c;这是gtk本身特性或称为特色决定的。下面是gtk常用控件在Mono C#中的一些用法。 Button控件 在工具箱中该控件的clicked信号双击后自动生成回调函数prototype&…

spawn_group | spawn_group_template | linked_respawn

字段介绍 spawn_group | spawn_group_template 用来记录与脚本事件或boss战斗有关的 creatures | gameobjects 的刷新数据linked_respawn 用来将 creatures | gameobjects 和 boss 联系起来&#xff0c;这样如果你杀死boss&#xff0c; creatures | gameobjects 在副本重置之前…

华为OD机试 - 查找一个有向网络的头节点和尾节点(Java JS Python C)

题目描述 给定一个有向图,图中可能包含有环,图使用二维矩阵表示,每一行的第一列表示起始节点,第二列表示终止节点,如 [0, 1] 表示从 0 到 1 的路径。 每个节点用正整数表示。 求这个数据的首节点与尾节点,题目给的用例会是一个首节点,但可能存在多个尾节点。同时图中…

万户OA-senddocument_import.jsp任意文件上传

0x01阅读须知 本文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考。本文章仅用于信息安全防御技术分享&#xff0c;因用于其他用途而产生不良后果,作者不承担任何法律责任&#…

systemverilog/verilog文件操作

1、Verilog文件操作 Verilog具有系统任务和功能,可以打开文件、将值输出到文件、从文件中读取值并加载到其他变量和关闭文件。 1.1 、Verilog文件操作 1.1.1、打开和关闭文件 module tb; // 声明一个变量存储 file handler integer fd; initial begin // 以写权限打开一个文…

翻译: Anaconda 与 miniconda的区别

Anaconda 和 miniconda 是广泛用于数据科学的软件发行版&#xff0c;用于简化包管理和部署。 1. 主要有两个区别&#xff1a; packages包数量&#xff1a; Anaconda 附带了 150 多个数据科学包&#xff0c;而 miniconda 只有少数几个。Interface接口&#xff1a;Anaconda 有…

VC++中使用OpenCV进行颜色检测

VC中使用OpenCV进行颜色检测 在VC中使用OpenCV进行颜色检测非常简单&#xff0c;首选读取一张彩色图像&#xff0c;并调用函数cvtColor(img, imgHSV, COLOR_BGR2HSV);函数将原图img转换成HSV图像imgHSV&#xff0c;再设置好HSV三个分量的上限和下限值&#xff0c;调用inRange函…

android使用相机 intent.resolveActivity returns null

问题 笔者使用java进行android开发&#xff0c;启动相机时 intent.resolveActivity returns null takePictureIntent.resolveActivity(getPackageManager()) null详细问题 笔者使用如下代码启动相机 // 启动相机SuppressLint("LongLogTag")private void dispatc…

计算机网络——第四层:传输层以及TCP UDP

1. 传输层的协议 1.1 TCP (传输控制协议) - rfc793 连接模式的传输。 保证按顺序传送数据包。 流量控制、错误检测和在数据包丢失时的重传。 用于需要可靠传输的应用&#xff0c;如网络&#xff08;HTTP/HTTPS&#xff09;、电子邮件&#xff08;SMTP, IMAP, POP3&#xff09;…