查找算法与排序算法

数据结构与算法自学网站(快乐学习数据结构) 可视化数据结构与算法 带教程的数据结构操作: https://visualgo.net/zh 是我最喜欢的网站了,教程也很详细,想自学也可以点击Esc,离开并进入探索模式。并且随着数据图动态变化,旁边还有代码进行配套讲解。也可以自己绘制图表来演示。 旧金山大学David Galles: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 特别齐全,什么算法都有。并且带插入带删除带排序等所有基本操作。 可按照代码进行步骤演示: http 阅读详情

查找算法

二分查找 (要求熟练)

// C

// 二分查找法(递归实现)
int binarySearch(int *nums, int target, int left, int right)		// left代表左边界,right代表右边界
{
	if (left > right)	return -1;		// 如果左边大于右边,那么说明找不到,直接返回-1
	int mid = (left + right) / 2;		// 计算出中间位置的下标
	if (nums[mid] == target) return mid;	// 如果刚好相等,就返回下标
	if (nums[mid] > target) return binarySearch(nums, target, left, mid - 1);	// 如果大于,说明肯定不在右边,直接去左边找
	else return binarySearch(nums, target, mid + 1, right);		// 如果小于,说明肯定不在左边,直接去右边找
}

更多内容

七大查找算法 (C语言实现):https://www.cnblogs.com/maybe2030/p/4715035.html

排序算法

基础排序

排序算法最好情况最坏情况空间复杂度稳定性
冒泡排序O(n)O(n^2)O(1)稳定
插入排序O(n)O(n^2)O(1)稳定
选择排序O(n^2)O(n^2)O(1)不稳定

冒泡排序 (要求熟练)

基本介绍

  • 冒泡排序的核心就是交换,通过不断地进行交换,一点一点将大的元素推向一端,每一轮都会有一个最大的元素排到对应的位置上,最后形成有序。

  • 动画演示:https://visualgo.net/zh/sorting

代码实现

// C

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 冒泡排序
void bubbleSort(int* arr, int size)
{
	int temp;
	bool ordered = true;	// 我们先假设传进来的数组是有序的
	for (int i = 0; i < size - 1; i++)
	{
		for (int j = 0; j < size - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])	// 如果没有执行if语句,说明数组确实是本来就有序
			{
				ordered = false;
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		if (ordered)
		{
			printf("该数组本来就有序!\n");
			return;
		}
	}
}

// 输出数组中的内容
void show(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


int main()
{
	// int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int arr[] = { 7, 3, 5, 9, 2, 0, 6, 1, 4, 8 };
	int arrSize = 10;

	show(arr, arrSize);

	// 冒泡排序
	bubbleSort(arr, arrSize);

	show(arr, arrSize);

	getchar();
	return 0;
}

插入排序

基本介绍

  • 我们默认第一个是有序状态,剩余的部分我们会挨着遍历,然后将其插到前面对应的位置上去

  • 每轮排序会从后面依次选择一个元素,与前面已经处于有序的元素,从后往前进行比较,直到遇到一个不大于当前元素的的元素,将当前元素插入到此元素的前面

  • 动画演示:https://visualgo.net/zh/sorting

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 插入排序
void insertSort(int* arr, int size)
{
	int current, j;
	for (int i = 1; i < size; i++)
	{
		current = arr[i];
		j = i;
		while (j > 0 && arr[j - 1] > current)
		{
			arr[j] = arr[j - 1];	// 找的过程中需要不断进行后移操作,把位置腾出来
			j--;
		}
		arr[j] = current;
	}
}

// 输出数组中的内容
void show(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


int main()
{
	int arr[] = { 7, 3, 5, 9, 2, 0, 6, 1, 4, 8 };
	int arrSize = 10;

	show(arr, arrSize);

	// 插入排序
	insertSort(arr, arrSize);

	show(arr, arrSize);

	getchar();
	return 0;
}

选择排序

基本介绍

  • 每轮排序会从后面的所有元素中寻找一个最小的元素出来,然后与已经排序好的下一个位置进行交换

  • 动画演示:https://visualgo.net/zh/sorting

代码实现

// C

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 选择排序
void selectSort(int* arr, int size)
{
	for (int i = 0; i < size - 1; i++)
	{
		int min = i;	// arr[min]能访问最小元素

		// 内部循环
		for (int j = i + 1; j < size; j++)
		{
			if (arr[min] > arr[j])	min = j;	// 更新下标
		}

		// 经过内部循环后,此时 arr[min] 访问的一定是最小元素
		int temp = arr[i];
		arr[i] = arr[min];
		arr[min] = temp;
	}
}


// 选择排序优化版:双选择排序
// 1. 交换函数
void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

// 2. 双选择排序
void twoSelectSort(int* arr, int size)
{
	// 设定最开始的范围为[0, size - 1], 每循环一轮后,left++, right--,缩小范围
	int left = 0, right = size - 1;

	// 每循环一轮,就缩小范围
	while (left < right)
	{
		int min = left, max = right;	// 假定当前范围内,最小数的下标为左边界的那一个,最大数的下标为右边界的那一个
		for (int i = left; i <= right; i++)		// 从当前的左边界一直遍历到当前的有边界,遍历过程中,记录最小数和最大数的下标
		{
			if (arr[i] < arr[min])	min = i;	// arr[i] 在不断变化的过程中,如果小于我们最开始假定的 arr[min] 最小值,就马上更新当前最小值的下标 min,从而记录了当前最新的最小值 arr[min]
			if (arr[i] > arr[max])	max = i;	// arr[i] 在不断变化的过程中,如果小于我们最开始假定的 arr[max] 最大值,就马上更新当前最小值的下标 max,从而记录了当前最新的最大值 arr[max]
		}
		// for 循环一轮过后,当前 arr[min] 和 arr[max] 存放的就是,这一轮 [left, right] 范围中的最小值和最大值
		swap(&arr[max], &arr[right]);		// 让当前最大值 arr[max] 和 我们假定的最大值 arr[right] 进行交换
		if (min == right)	min = max;		// 如果上面的要被交换的 arr[right] 刚好是本轮的最小值 arr[min],那么发生交换后,arr[max] 里面存放的才是我们最开始的 arr[min],所以我们需要更新 min
		swap(&arr[min], &arr[left]);		// 让当前最小值 arr[min] 和 我们假定的最小值 arr[left] 进行交换
		left++;		// 缩小范围
		right--;	// 缩小范围
	}
}

// 输出数组中的内容
void show(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


int main()
{
	int arr[] = { 7, 3, 5, 9, 2, 0, 6, 1, 4, 8};
	int arrSize = 10;

	show(arr, arrSize);

	// 选择排序
	// selectSort(arr, arrSize);	// 选择排序
	twoSelectSort(arr, arrSize);	// 双选择排序

	show(arr, arrSize);

	getchar();
	return 0;
}

进阶排序

排序算法最好情况最坏情况空间复杂度稳定性
快速排序O(nlogn)O(n^2)O(nlogn)不稳定
希尔排序O(n^1.3)O(n^2)O(1)不稳定
堆排序O(nlogn)O(nlogn)O(1)不稳定

快速排序 (要求熟练)

基本概念

  • 快速排序是冒泡排序的进阶版本

  • 在冒泡排序中,进行元素的比较和交换是在相邻元素之间进行的,元素每次交换只能移动一个位置,所以比较次数和移动次数较多,效率相对较低

  • 而在快速排序中,元素的比较和交换是从两端向中间进行的,较大的元素一轮就能够交换到后面的位置,而较小的元素一轮就能交换到前面的位置,元素每次移动的距离较远,所以比较次数和移动次数较少,就像它的名字一样,速度更快

代码实现

图1:

在这里插入图片描述

图2:

在这里插入图片描述

代码:

// C

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 快速排序
void quickSort(int* arr, int start, int end)
{
	// 结束递归
	if (start >= end)	return;

	// ------------------------ 快速排序算法逻辑主体 ------------------------
	int leftPointer = start, rightPointer = end;	// 定义一对左右指针,方便待会标记
	int reference = arr[leftPointer];				// 选定参考值

	while (leftPointer < rightPointer)		// 两个指针不相遇才能进行循环
	{
		// 从右边开始,一直向左边寻找,直到找到比参考值小的数,将这个数移动到 arr[leftPointer]
		while (leftPointer < rightPointer && arr[rightPointer] >= reference)	rightPointer--;
		arr[leftPointer] = arr[rightPointer];

		// 从左边开始,一直向右边寻找,直到找到比参考值大的数,将这个数移动到 arr[rightPointer]
		while (leftPointer < rightPointer && arr[leftPointer] <= reference)		leftPointer++;
		arr[rightPointer] = arr[leftPointer];
	}

	// 退出循环,说明两个指针相遇,说明此时 leftPointer = rightPointer
	arr[leftPointer] = reference;	// 或者 arr[rightPointer] = reference;	两个都一样

	// 继续递归下去
	quickSort(arr, start, leftPointer - 1);
	quickSort(arr, rightPointer + 1, end);
}


// 输出数组中的内容
void show(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


int main()
{
	int arr[] = { 7, 3, 5, 9, 2, 0, 6, 1, 4, 8 };
	int arrSize = 10;

	show(arr, arrSize);

	// 快速排序
	quickSort(arr, 0, arrSize - 1);

	show(arr, arrSize);

	getchar();
	return 0;
}

希尔排序

基本介绍

  • 希尔排序又叫缩小增量排序

  • 希尔排序是插入排序的进阶版本

  • 希尔排序对插入排序进行改进,它会对整个数组按照步长进行分组,优先比较距离较远的元素

  • 这个步长是由一个增量序列来定的,这个增量序列十分重要

代码实现

// C

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>


// 希尔排序
void shellSort(int arr[], int size) {
	int delta = size / 2;
	while (delta >= 1) {
		// 这里依然是使用之前的插入排序,不过此时需要考虑分组了
		for (int i = delta; i < size; ++i) {		// 我们需要从delta开始,因为前delta个组的第一个元素默认是有序状态
			int j = i, tmp = arr[i];		// 这里依然是把待插入的先抽出来
			while (j >= delta && arr[j - delta] > tmp) {
				// 注意这里比较需要按步长往回走,所以说是j - delta,此时j必须大于等于delta才可以,如果j - delta小于0说明前面没有元素了
				arr[j] = arr[j - delta];
				j -= delta;
			}
			arr[j] = tmp;
		}
		delta /= 2;		// 分组插排完事之后,重新计算步长
	}
}


// 输出数组中的内容
void show(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


int main()
{
	int arr[] = { 7, 3, 5, 9, 2, 0, 6, 1, 4, 8 };
	int arrSize = 10;

	show(arr, arrSize);

	// 快速排序
	shellSort(arr, arrSize);

	show(arr, arrSize);

	getchar();
	return 0;
}

堆排序

基本认识

  • 堆排序也是选择排序的一种,但是它能够比直接选择排序更快
  • 对于一棵完全二叉树,树中父亲结点都比孩子结点小的我们称为小根堆(小顶堆),树中父亲结点都比孩子结点大则是大根堆
  • 得益于堆是一棵完全二叉树,我们可以很轻松地使用数组来进行表示

在这里插入图片描述

// C

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 输出数组中的内容
void show(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


// 堆
typedef int E;
typedef struct MinHeap {
	E* arr;
	int size;
	int capacity;
} *Heap;


// 初始化堆
bool initHeap(Heap heap) {
	heap->size = 0;
	heap->capacity = 10;
	heap->arr = (E*)malloc(sizeof(E) * heap->capacity);
	return heap->arr != NULL;
}


// 插入元素
bool insert(Heap heap, E element) {
	if (heap->size == heap->capacity) return false;
	int index = ++heap->size;
	while (index > 1 && element < heap->arr[index / 2]) {
		heap->arr[index] = heap->arr[index / 2];
		index /= 2;
	}
	heap->arr[index] = element;
	return true;
}

// 删除元素
E remove(Heap heap) {
	E max = heap->arr[1], e = heap->arr[heap->size--];
	int index = 1;
	while (index * 2 <= heap->size) {
		int child = index * 2;
		if (child < heap->size && heap->arr[child] > heap->arr[child + 1])
			child += 1;
		if (e <= heap->arr[child]) break;
		else heap->arr[index] = heap->arr[child];
		index = child;
	}
	heap->arr[index] = e;
	return max;
}


int main() {
	int arr[] = { 3, 5, 7, 2, 9, 0, 6, 1, 8, 4 };
	int arrSize = 10;

	show(arr, arrSize);

	struct MinHeap heap;    // 创建堆
	initHeap(&heap);		// 初始化堆

	for (int i = 0; i < 10; ++i)
	{
		insert(&heap, arr[i]);		// 直接把乱序的数组元素挨个插入
	}

	for (int i = 0; i < 10; ++i)
	{
		arr[i] = (int)remove(&heap);		// 然后再一个一个拿出来,就是按顺序的了
	}

	show(arr, arrSize);

	getchar();
	return 0;
}
常见面试的查找和排序算法 一、排序总结 其他查找算法:深度优先查找、广度优先查找、二叉树查找(先、中、后、层序遍历)等。 (1) 快排 private void quicksort(int[] array, int begin, int end) { // TODO Auto-generated method stub if(begin&amp;amp;amp;amp;lt;end) { int key=array[begin]; ... 阅读详情

相关推荐

android技术--------如何解决弹出键盘只影响当前fragment输入的窗口

题目比较长,也可能有很多人不明所以这东西有啥可写的,简单来说就是实现近似于Android Pad 上QQHD聊天的界面效果,搞了很长的事件,今天终于搞定。 android3.0新加了组件Fragment称之为碎片,对这个一无所知的请自觉补习。今天的阐述将基于此组件。 fragment可以放入activity中,并随activity的生命周期变化而变化,但当相应键盘事件的时候,就比较让人挠头了,

3506

冒泡,选择,插入排序学习记录

冒泡排序 冒泡排序动画理解:https://visualgo.net/zh/sorting 思路 总共要经过arr.length-1趟排序,每次排序要经过arr.length - 1 - i(i是趟数) 需要一个中间变量用来交换数组里面数据的位置 需要一个标识符,用来确认一趟下来是否有进行交换数据位置,标识符在进行一趟之后要重置标识符值 代码实现 package com.lilvencent.sort; import java.util.Arrays; /** * @author Lil *

LIl_wen的博客 295

保姆级教程:用MATLAB搞定运动模糊图片修复(附完整代码与避坑指南)

本文提供了一份详细的MATLAB运动模糊图片修复教程,涵盖盲复原、图像复原等核心技术。通过傅里叶变换和Radon变换分析模糊参数,对比逆滤波、维纳滤波和Lucy-Richardson算法效果,并附完整代码与避坑指南,帮助用户实现专业级图像处理。

weixin_26765363的博客 228

数据结构与算法(五)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KYrRfrDL-1686205257569)(https://s2.loli.net/2022/08/21/cTmg9sCrzIuHhBb.png)]

qq_45420103的博客 650

(保姆式教程:从下数据到画图)python如何利用EOF分析SSTA海温异常现象并画图

保姆式教程,教你如何利用python分析1979-2004年的太平洋地区的海温异常SSTA,并且绘制出空间模态和时间序列的图片。

shayuxing的博客 2万+

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

快速排序【排序算法】

目录 1.理解 2.动态可视化 3.静态示例 4.实现 5.是否是稳定的 1.理解 快速排序是冒泡排序的变种,提高了效率。 2.动态可视化 https://visualgo.net/zh/sorting 3.静态示例 4.实现 public class QuickSort { public static void quickSort(int[] arr,int startIndex,int endIndex){ // ...

风逸云舒 354

《AI应用架构师必学:企业AI能力地图构建的高级技巧》

企业AI能力地图,简单来说,是一种可视化工具,它展示了企业在AI领域所具备的各种能力及其相互关系。就如同城市地图展示城市的街道、建筑和设施一样,AI能力地图呈现了企业在数据处理、模型开发、算法应用等多个方面的能力布局。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 819

选择排序【排序算法】

1.理解 选择当前指针之后的数据(最大值或者最小值)放到该指针所指向的位置即可。 2.动态可视话演示 https://visualgo.net/zh/sorting 3.静态图示 4.实现 public static int[] sort(int[] array) { ​ if (array.length == 0) { ​ return array; ​ } ​ for (int i = 0; i &...

风逸云舒 297

类银河恶魔城游戏开发学习笔记(0)

解决B站搬运【Unity教程】从0编程制作类银河恶魔城游戏P37中moveState和idleState循环切换的问题

Gellar的博客 1447

Python爬虫:实时交通流量数据爬取与路况分析

随着城市化进程的不断推进,交通流量的管理与预测已成为智能交通系统的重要研究方向。交通流量数据不仅为城市交通管理提供了科学依据,还为驾驶员提供了实时路况信息,帮助其做出更加合理的出行决策。通过爬虫技术,我们可以实时获取城市的交通流量数据,从而分析路况,优化交通管理。在这篇博客中,我们将介绍如何使用Python编写一个爬虫来爬取实时交通流量数据,分析道路的交通状况。我们将使用最新的技术工具来构建爬虫,包括。

2201_76125261的博客 1267

Java的查找算法和排序算法

插值查找在二分查找的基础上改进。前提条件:数据尽可能的分布均匀。

iFulling的博客 1395

科研绘图系列:R语言circos图(circos plot)

科研绘图系列:R语言circos图(circos plot)

专注生信领域 3431

常见查找和排序算法汇总

主要内容: 顺序查找、折半查找-------查找算法 冒泡排序、简单选择排序、直接插入排序、希尔排序、归并排序、快速排序、堆排序------排序算法 一、查找 1、顺序查找 从最后一个记录开始,逐个进行比较,若相等则查找成功,否则查找失败。 //顺序查找 a[1 - len] int Sq_Search(int a[],int key,int len) { int i; //哨兵,使内循环不用判断数组是否越界,提高程序运行效率,减少查找时间 a[0] = key; for(i = len;a[

qq_44829047的博客 3760

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

查找、排序算法整理

查找、排序算法整理查找算法分类排序算法分类查找和排序总结查找算法排序算法 查找算法分类 查找可分为静态查找和动态查找: 静态查找:仅对查找表做查询和检索操作。 动态查找:在查找时包含插入、删除或修改。 还可分为无序查找和有序查找: 无序查找:被查找数列有序无序均可。 有序查找:被查找数列必须为有序数列。典型的有二分查找、插值查找、斐波那契查找。 排序算法分类 排序包括内部排序和外部排序: 内部排序:整个排序过程不需要访问外存即可完成。 外部排序:若参加排序的记录数量很大,整个序列的排序过程不可能在

不务正业的程序媛的博客 539

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

常见的查找算法、排序算法以及Lambda

插入排序是一种最简单直观的排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。跟打扑克牌,把牌插入正确的位置一样。遍历无序的数据,将要插入的元素从后往前与前面的元素进行比较,如果小于前面的元素就进行交换,然后将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。其实就是因为方便,简单,但是如果我能在二分查找的基础上,让中间的mid点,尽可能靠近想要查找的元素,那不就能提高查找的效率了吗?分块查找时块间有序,块内无序。

2301_76580356的博客 744

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

排序算法和查找算法

数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉有疑惑,可以先看一下哥们后面录制的数据结构,再回头看算法。

jiayu123321的博客 990

数据结构——查找算法和排序算法

需求:封装一个函数,写出在一个整型数组中查找目标元素的算法,找到了返回该元素所在索引;找不到返回-1。

2301_81699298的博客 1086

排序算法和查找算法总结

#排序算法总结 1.冒泡排序 解释: ​ 所谓冒泡排序,就是如同水里的泡泡一样,将合适的值一次次往上冒,直到所有数据全部处理完成。 在数据中的解释就是:从第一个数开始,每次都将前一个数与后一个数作比较,如果前一个数大于后一个数,则将两者交换位置(否则不交换),此时,后一个数值已变化,然后再将后一个数与后后一个数作比较,重复操作,直到所有的数都比较完成。 算法过程: ​ 先定义一个外循环,控制整个...

HelloCode的博客 2879

七大常见查找算法和十大排序算法

​ 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉有疑惑,可以先看一下哥们后面录制的数据结构,再回头看算法。

qq_57407715的博客 4259

查找排序算法汇总

摘要: 插入排序分为三种: 直接插入排序 基本思想就是挨个遍历,第二个元素和第一个比,第三个元素和前两个比,第四个和前三个比,如果合适就移动后面的元素,插入当前元素 二分插入排序 基于二分查找算法的思想,不挨个比,每次找中间数进行比较,如果合适就移动后面的元素,插入当前元素 希尔排序 希尔排序适用大规模且无序的数据,上述两种适合小规模且有序的数据。 希尔排序的核心思想是分组,...

Noneplus 846

七种查找算法,十大排序算法

​ 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉有疑惑,可以先看一下哥们后面录制的数据结构,再回头看算法。

小丁的博客 1044

从零开始学习 Java:简单易懂的入门指南之查找算法及排序算法(二十)

基本思想:二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。更多的是先计算出当前数据的哈希值,用哈希值跟数组的长度进行计算,计算出应存入的位置,再挂在数组的后面形成链表,如果挂的元素太多而且数组长度过长,我们也会把链表转化为红黑树,进一步提高效率。但是排序之后,会改变原有数据的顺序,查找出来元素位置跟原来的元素可能是不一样的,所以排序之后再查找只能判断当前数据是否在容器当中,返回的索引无实际的意义。因此被称为黄金分割。

m0_59230408的博客 4871

常见的查找和排序算法

常见的几种数据查找算法和排序算法

x2624252655的博客 461

查找和排序算法

本文介绍了三种常见的查找算法:顺序查找、二分查找和分块查找,以及哈希表的两种实现方法。 顺序查找:通过遍历数组逐个比较查找元素,时间复杂度为O(n),适用于小规模无序数据。 二分查找:要求数据有序,通过不断缩小查找范围,时间复杂度为O(logn),效率较高。 分块查找:将数据分块并建立索引表,块间有序块内无序,先定位块再查找,适合大规模数据。 哈希表: 直接地址法:通过简单数学关系确定存储位置 数字分析法:选取关键字的特定部分作为哈希值 文中提供了每种算法的C语言实现代码,并说明了适用场景和优缺点。

2503_92753964的博客 1058

解释什么是排序算法和查找算法

和是计算机科学中两个非常重要的概念,它们分别用于处理数据集合中的排序和查找问题。

m0_46552684的博客 478
上一篇: 数据结构与算法---树
下一篇: STL速查
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值