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

排序算法

时间:2023-10-15 17:56:41浏览次数:33  
标签:arr int 算法 数组 array 排序 size

排序算法

1、冒泡排序

​ 冒泡排序是一种非常直接,但是性能比较低的排序方法,其时间复杂度为$\mathcal{O}{n^2}$,它通过两两比较数组中的元素,若第一个元素大于第二个元素,则将两个元素交换位置,逐步将元素中的最大值归位。其排序过程如下图所示:

C++代码如下:

template<typename T>
void bubble_sort(vector<T> array)
{
	int size = array.size();
	for(int i = 0;i < size - 1; i++)
	{
		for(int j = 0;j < size-1-i; j++)
        {
            if(array[j]>array[j+1])
                swap(array[j].array[j+1]);
		}
	}
}

python代码如下:

def bubbleSort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

2、选择排序

​ 选择排序是通过查找未排序部分的最小值,然后将其与第一个未排序的元素进行交换的过程,也就是通过遍历数组,将其每个未排序的位置与未排序部分的最小值进行交换,也就得到了一个从小到大排序的数组,时间复杂度也为$\mathcal{O}{n^2}$其过程如下图所示:

C++代码:

template<typename T>
void selection_sort(vector<T>& arr)
{
    int size = arr.size();
	for (int i = 0; i < arr.size() - 1; i++)
	{
		int min_index = i;
		for (int j = i + 1; j < arr.size(); j++)
		{
			if (arr[j] < arr[min_index])
				min_index = j;
		}
		swap(arr[i], arr[min_index]);
	}
}

python代码:

def selectionSort(arr):
    for i in range(len(arr) - 1):
        min_index = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[i], arr[min_index] = arr[min_index], arr[i]
    return arr

3、插入排序

​ 我们将一个数组分为已排序子数组和未排序子数组,在一开始,一个初始数组的已排序子数组只包含原始数组的第一个元素,插入排序通过将未排序数组的第一个元素插入到已排序子数组中的合适位置来达到排序的目的,时间复杂度为$\mathcal{O}{n^2}$,其排序过程如下图所示:

C++代码:

template<typename T>
void insertion_sort(vector<T>& array)
{
    int size = array.size();
	for (int i = 1; i < size; i++)
	{
		int temp = array[i];
		int j = i - 1;
		for (; j >= 0; j--)
		{
			if (array[j] > temp)
				array[j + 1] = array[j];
			else
				break;
		}
		array[j+1] = temp;
	}
}

python代码:

def insertionSort(arr):
    for i in range(len(arr)):
        preIndex = i-1
        current = arr[i]
        while preIndex >= 0 and arr[preIndex] > current:
            arr[preIndex+1] = arr[preIndex]
            preIndex-=1
        arr[preIndex+1] = current
    return arr

4、归并排序

​ 归并排序首先将初始数组分为两个大致相等的部分,若数组有奇数个元素,则其中一半比另一半多一个元素,子数组再以上述过程分成两部分,直到每个数组只有一个元素,之后再将两两数组合并成一个数组,合并的过程中将两数组以从小到大的顺序进行排列,直到最后将所有子数组合并成一个单一的数组,其时间复杂度为$\mathcal{O}(n \ log_{}\ n)$,排序过程如下图所示:

C++代码:

void merge(vector<int>& array, int start, int end)  //合并函数
{
	if (start == end)
		return;
	int mid = (start + end) / 2;
	merge(array, start, mid);
	merge(array, mid + 1, end);
	vector<int> res;  
	int i = start, j = mid + 1, k = 0;    
	while (i <= mid && j <= end) //合并两个数组
	{
		if (array[i] <= array[j])
		{
			res.push_back(array[i]);//按从小到大存放在res数组里面
			i++;
		}
		else
		{
			res.push_back(array[j]);
			j++;
		}
	}
	while (i <= mid)  // j 序列结束,将剩余的 i 序列补充在res数组中 
	{
		res.push_back(array[i]);
		i++;
	}
	while (j <= end)// i 序列结束,将剩余的 j 序列补充在res数组中 
	{
		res.push_back(array[j]);
		j++;
	}
	k = 0;  //从小标为 0 开始传送
	for (int i = start; i <= end; i++)  //将res数组的值传递给数组array
	{
		array[i] = res[k++];
	}     
}

void mergesort(vector<int>& a) //归并排序
{
	merge(a, 0, a.size() - 1);
}

python代码:

# 归并排序
def merge_sort(num_list):
    length = len(num_list)

    # 递归终止退出条件
    if length <= 1:
        return num_list

    # 拆分
    mid = length // 2
    left_l = merge_sort(num_list[:mid])   # 对左侧的列表进行排序
    right_l = merge_sort(num_list[mid:])  # 对右侧的列表进行排序

    # merge 合并操作
    # 初始化两个指针p, q 初始位置为起始位置,初始化一个临时数组temp_list
    p, q, temp_list = 0, 0, list()
    len_left, len_right = len(left_l), len(right_l)  # 计算当前被合并的列表的长度

    while len_left > p and len_right > q:
        if left_l[p] <= right_l[q]:
            temp_list.append(left_l[p])
            p += 1
        else:
            temp_list.append(right_l[q])
            q += 1
    # 如果left 和 right 的长度不相等,把长的部分直接追加到列表中
    temp_list += left_l[p:]
    temp_list += right_l[q:]

    return temp_list


if __name__ == '__main__':
    num_list = [44, 23, 1, 14, 6, 9, 4, 5, 33]
    new_list = merge_sort(num_list)
    for k, v in enumerate(new_list):
        num_list[k] = v
    print('num_list:', num_list)

标签:arr,int,算法,数组,array,排序,size
From: https://www.cnblogs.com/mjyrise/p/17765876.html

相关文章

  • C语言快速排序详解
    【1】快速排序核心思想核心思想是分而治之,每一轮排序都会选出一个基准,一轮排序完成后,所有比基准小的数一定在左边,比基准大的数一定在右边,在分别通过同样的方法对左右两边的数组进行排序,不断划分,最后完成整个数组的排序。它的效率相比冒泡排序的双重for循环有所提升。时间复杂......
  • Python滑动窗口算法:滑动窗口算法(4 by 4 sliding window price)
    我知道滑动窗口算法的时间复杂度是o(N),但是可变大小的滑动窗口算法的时间复杂度是多少。对于e-数组=[1,2,3,4,5,6]当滑动窗口的大小为=1时窗口-[1],[2],[3],[4],[5],[6]当滑动窗口的大小为=2时窗口-[1,2],[2,3],[3,4],[4,5],[5,6]当滑动窗口的大小为=3时窗口-[1,2,3],[2......
  • 数据结构和算法基础(Java语言实现)pdf电子版柳伟卫2021年
    数据结构和算法基础(Java语言实现)pdf电子版下载作者: 柳伟卫出版年: 2021-11ISBN: 9787301325872下l载连接最新Java领域的算法、数据结构方面的知识书籍。越是基础越是重要!......
  • 【高级机器学习算法】6.机器学习应用建议
    模型评估模型评估是机器学习中非常重要的一部分,它可以帮助我们评估模型的好坏,从而选择最优的模型。评估方式在机器学习中,我们通常会将数据集划分为训练集和测试集,训练集用于训练模型,测试集用于评估模型的好坏。评估指标训练误差:模型在训练集上的误差,用于衡量模型在训练集上......
  • sort是不稳定排序
    一道题调了一周,今天终于调过了……题目不算很难写,就是poj1007的DNAsorting,字符串求逆序数然后升序排序。之前交的代码是这样的:#include<iostream>#include<algorithm>usingnamespacestd;typedefstructnode{charstr[55];intnum;}Node;boolcmp(Nodea......
  • 22_STL之算法
    STL之算法函数对象重载函数调用操作符的类,其对象常称为函数对象(functionobject),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得类对象可以像函数那样调用。注意:​ 1.函数对象(仿函数)是一个类,不是一个函数。​ 2.函数对象(仿函数)重载了"......
  • 《算法学习专栏》—— DP问题之状态机模型
    2023年10月13日更新于2023年10月13日一、前言本栏,为状态机模型,题目主要来源日常,目前主要来源于Acwing的提高课。希望以后做到状态机的题目,也能加进来,不断完善。使用的分析方法均为闫式DP分析法。字臭。。。希望能用手写板慢慢写的好看。二、状态机模型2.1对于状态机的考虑......
  • 算法第2章实践报告1
    7-1Cablemaster(切割绳子)有N条绳子,它们的长度分别为x。如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?输入格式:第一行两个整数n和k(1<=n<=10000;1<=k<=10000)。接下来n行,描述了每条绳子的长度x,x也是整数。输出格式:切割后每条绳子的最大长度。完整代码:......
  • 【算法题】6939. 数组中的最大数对和
    题目:给你一个下标从0开始的整数数组nums。请你从nums中找出和最大的一对数,且这两个数数位上最大的数字相等。返回最大和,如果不存在满足题意的数字对,返回-1。示例1:输入:nums=[51,71,17,24,42]输出:88解释:i=1和j=2,nums[i]和nums[j]数位上最大的数字相等,且这......
  • 【算法题】88. 合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的......