排序算法

图 一.插入排序(Insertion Sort) 插入排序,如打扑克时的理牌一样,左手为空,从牌堆摸牌,将摸到的牌从右往左对比,放到比其小的牌的右边。 代码示例:

#include<iostream>
using namespace std;
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++) {
		cin >> a[i];
	}
	//4 5 2 8 1 9 3 7 6 0 a数组的key
	//0 1 2 3 4 5 6 7 8 9 i下标
	for (int i = 2; i < 10; i++) {
		int key = a[i];//选定一个数将其与左边的数一一对比
		int j = i - 1;
		while (j >= 0 && a[j] < key) //如果比选定的数字大则将其右移
        {
			a[j + 1] = a[j];
			j--;
		}
		a[j + 1] = key;
	}
	for (int i = 0; i < 10; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

二.选择排序(Selection sort) 遍历数组,找到最小的数,交换位置,让最小的数排在前面 代码示例:

#include<iostream>
using namespace std;
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)cin >> a[i];

	for (int i = 0; i < 10; i++) {
		int temp = i;
		for (int j = i; j < 10; j++) {
			if (a[j] < a[temp]) {
				temp = j;
			}
		}
		swap(a[i], a[temp]);
	}
	for (int i = 0; i < 10; i++) {
		cout << a[i] << " ";
	}

	return 0;
}

三.冒泡排序(Bubble Sort) 每次就行两个数之间的比较,将大(小)的数放在右边,每次循环更大(小)的数会像泡泡一样飘到最右边. 代码示例:

#include<iostream>
using namespace std;
int main()
{
	// 定义包含10个元素的整数数组
	int a[10];
	for (int i = 0; i < 10; i++) {
		// 从标准输入流读取用户输入的整数,并存储到数组a中
		cin >> a[i];
	}

	// 使用冒泡排序算法对数组a进行排序
	for (int i = 0; i < 10; i++) {
		for (int j = i + 1; j < 10; j++) {
			// 如果当前元素大于后续元素,则交换它们的位置
			if (a[i] > a[j]) {
				int temp=a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}

	// 输出排序后的数组a
	for (int i = 0; i < 10; i++) {
		cout << a[i] << " ";
	}

	// 返回程序运行成功状态
	return 0;
}

四.合并排序(Merge sort) 利用递归,将原数组拆分,接着合并的同时排序,如图 合并排序 代码示例:

#include<iostream>
#include<vector>
using namespace std;

// 归并排序的辅助函数,用于将两个已排序的子数组合并为一个排序数组
void merge(vector<int>& a, int l, int mid, int r) {
	int nx = mid - l + 1;  // 计算第一个子数组的大小
	int ny = r - mid;      // 计算第二个子数组的大小
	vector<int>P(nx);      // 创建第一个子数组
	vector<int>Q(ny);      // 创建第二个子数组

	// 将元素复制到临时数组P和Q中
	for (int i = 0; i < nx; i++) {
		P[i] = a[l + i];
	}
	for (int i = 0; i < ny; i++) {
		Q[i] = a[mid + 1 + i];
	}

	int i = 0, j = 0, k = l;
	// 合并两个子数组
	while (i < nx && j < ny) {
		if (P[i] <= Q[j]) {
			a[k] = P[i];
			i++;
		}
		else {
			a[k] = Q[j];
			j++;
		}
		k++;
	}

	// 将剩余的元素复制回原数组
	while (i < nx) {
		a[k] = P[i];
		i++;
		k++;
	}
	while (j < ny) {
		a[k] = Q[j];
		j++;
		k++;
	}
}

// 归并排序算法的主要逻辑,递归地将数组分为较小的数组,并调用merge函数进行合并
void merge_sort(vector<int>& a, int l, int r) {
	if (l < r) {
		int mid = (l + r) / 2;      // 计算中间索引
		merge_sort(a, l, mid);           // 递归排序左半部分
		merge_sort(a, mid + 1, r);       // 递归排序右半部分

		merge(a, l, mid, r);             // 合并两个已排序的子数组
	}
}

int main()
{
	vector<int>a(10);       // 创建一个包含10个元素的向量

	// 从标准输入中读取输入元素并存储在向量中
	for (int i = 0; i < 10; i++) {
		cin >> a[i];
	}

	merge_sort(a, 0, a.size() - 1);   // 对输入的数组进行归并排序

	// 输出排序后的数组元素
	for (int i = 0; i < 10; i++) {
		cout << a[i] << " ";
	}

	return 0;
}

五.快速排序(Quick Sort) 快速排序维护左右指针left,right和基准点base 先让right不断向左扫,找到比base大(小)的值然后与left指向的值交换 然后left不断向右扫,找到比base小(大)的值然后与right指向的值交换 一次操作后会形成两个区间,然后分别对两个区间进行上述操作 代码示例中用了两种方法,一种普通的,一种使用分治 代码示例:

#include<iostream>

using namespace std;

void quickSort_num1(int arr[], int star, int end) {
    //确定左右指针的位置
    int left = star, right = end;
    //设置基准点
    int base = arr[star];
    if (left < right) {
        while (left < right) {
            //先让由指针不断往左寻找比 base 小的值,找到了便交换
            //如果没找到,此时left = right 等于没交换
            while (left < right && arr[right] >= base) {
                right--;
            }
            arr[left] = arr[right];
            //先让由指针不断往右寻找比 base 大的值,找到了便交换
            //如果没找到,此时left = right 等于没交换
            while (left < right && arr[left] <= base) {
                left++;
            }
            arr[right] = arr[left];
        }
        //arr[right] = base 也可以,因为最终left=right
        arr[left] = base;
        //接着再让分割好的两个小区间进行上述操作
        //左边区间为比base小的值
        quickSort_num1(arr, star, left - 1);
        //右边区间为比base大的值
        quickSort_num1(arr, left + 1, end);
    }
}

//采用分治的方法,先找分割点
//partition为寻找分割点的函数
int partition(int arr[], int left, int right) {
    int base = arr[left];
    while (left < right) {
        //先让由指针不断往左寻找比 base 小的值,找到了便交换
        //如果没找到,此时left = right 等于没交换
        while (left < right && arr[right] >= base) {
            right--;
        }
        arr[left] = arr[right];
        //先让由指针不断往右寻找比 base 大的值,找到了便交换
        //如果没找到,此时left = right 等于没交换
        while (left < right && arr[left] <= base) {
            left++;
        }
        arr[right] = arr[left];
    }
    arr[left] = base;
    return left;
}

void quickSort_num2(int arr[], int left, int right) {
    if (left < right) {
        //确定分割点
        int pos = partition(arr, left, right);
        //左右区间,再重复操作
        quickSort_num2(arr, left, pos - 1);
        quickSort_num2(arr, pos + 1, right);
    }
}

int main() {
    int arr1[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 10};
    quickSort_num1(arr1, 0, 9);
    for (int i = 0; i < 10; i++) {
        cout << arr1[i] << " ";
    }
    cout << '\n';
    //采用分治思想
    int arr2[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 10};
    quickSort_num2(arr2, 0, 9);
    for (int i = 0; i < 10; i++) {
        cout << arr2[i] << " ";
    }
    cout << '\n';
    return 0;
}

排序

更新于 2024/06/05

评论

评论 0

暂无评论
全部文章
music

521755ldsdl.jpg

关于

QAQ

C++离散化

为什么要离散化处理? 数据过于多时难以表示数组下标 离散化是什么? 可以类比哈希表 离散化就像哈

教程超详细xcpc滚榜教程

首先需要导出比赛的表格 1.处理表格 最终效果如下图 自行添加的列有id,judged,solv

C++快速幂

快速幂 用于快速求a^b的算法 思想:拆分 例:求2^13 等价于求 2^1 * 2^4 * 2

C++高精度运算(加减乘除)

在程序中高精度加法和高精度减法的运算本质是模拟我们在小学就学过的运算规则,也是我们平时用的运算规

C++素数筛法(埃氏筛法、线性筛法)

素数筛法:用于筛选出素数 核心思想:用一个数筛选其余的数 普通筛法: 时间复杂度为O(nlogn

C++二叉树的建立与遍历

二叉树是一种非线性数据结构. 二叉树 由节点构成,每个节点包含节点值和指向左节点和右节点的指针.

C++链表

链表是一种逻辑结构上的线性表,物理结构上的非线性表 链表由许多节点组成,每个节点有对应的值和指向

C++C++实现顺序表

顺序表,一种线性表,因此顺序表是线性的. 因为顺序表在物理结构与逻辑结构都是连续的.意味着在内存

PythonPython基础

标识符 Python中标识符由字母,数字,下划线组成. 字母区分大小写,不能以数字开头,以下划线

算法并查集

并查集 :并为合并(合并两个节点),查为查询(查询根节点),集是一个集合. 联通块问题 //各个

K 随时打开ESC 关闭

阅读设置

设置仅保存在当前设备。

主题

背景

文章布局