十大经典算法排序

排序算法(初分为两部分)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

冒泡排序

前后数据两两间相互比较大小

图像演示
在这里插入图片描述

代码实现 (输入一组数据的个数,然后依次输入该组数据的内容,进行正序排列)

#include<bits/stdc++.h>
using namespace std;
#define N 100
void swap_sort(int arr[], int x, int y) {
    int temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
}
void Bubblesort(int arr[], int length) {
    for (int i = 0; i < length - 1; i++) {//外层循环是排序次数,例:5组数就要比较4次,及数组长度减1
        for (int j = 0; j < length - 1 - i; j++) {//内层循环是比较数据,外层循环每一次就可以确定最后面一位数,所以lengt-1-i表示外层循环第i次,内层可以少比较下标为length-1-i的这个数
            if (arr[j] > arr[j + 1]) {
                swap_sort(arr, j + 1, j);
            }
        }
    }
}

int main() {
    int arr[N], n, i;
    cin >> n;//n为输入的数的个数
    for (i = 0; i < n; i++) {
        cin >> arr[i];
    }
    Bubblesort(arr, n);
    for (i = 0; i < n; i++) {
        cout << arr[i]<<" ";
    }
    return 0;
}

快速排序

图像演示
1.选择数据中的一个数为基准
2.利用分治思想,把比基准数据小的放到前面
3.重复以上操作,将分区完后小于原基准数据和大于原基准的数据再分别确定基准进行子数列排序。
视频解析,感谢up主的技术分享
在这里插入图片描述

代码实现(输入一组数据的个数,然后依次输入该组数据的内容,进行正序排列)

#include <bits/stdc++.h>
using namespace std;
#define N 1000
int part(int arr[], int low, int hight)  //划分函数
{
	int i = low, j = hight, pivot = arr[low]; //基准元素
	while (i < j)
	{
		while (i<j && arr[j]>pivot) //从右向左开始找一个 小于等于 pivot的数值
		{
			j--;
		}
		if (i < j)
		{
			swap(arr[i++], arr[j]);  //r[i]和r[j]交换后 i 向右移动一位
		}
		while (i < j && arr[i] <= pivot) //从左向右开始找一个 大于 pivot的数值
		{
			i++;
		}
		if (i < j)
		{
			swap(arr[i], arr[j--]);  //r[i]和r[j]交换后 i 向左移动一位
		}
	}
	return i;  //返回最终划分完成后基准元素所在的位置
}
void Quicksort(int arr[], int low, int hight)
{
	int mid;
	if (low < hight)
	{
		mid = part(arr, low, hight);  // 返回基准元素位置
		Quicksort(arr, low, mid - 1); // 左区间递归快速排序
		Quicksort(arr, mid + 1, hight); // 右区间递归快速排序
	}
}
int main()
{
	int arr[N],n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
	}
	Quicksort(arr, 0, n - 1);
	for (int i = 0; i < n ; i++)
	{
		cout << arr[i] << " ";
	}
	return 0;
}

归并排序

1.将序列中带排序数字分为若干组,每个数字分为一组
2.将若干个组两两合并,保证合并后的组是有序的
3.重复第二步操作直到只剩下一组,排序完成
视频链接,感谢up主的知识分享

在这里插入图片描述

代码实现

#include<bits/stdc++.h>
using namespace std;
#define N 1000
void merge(int arr[], int len) {
    int* a = arr;
    int* b = new int[len];
    for (int seg = 1; seg < len; seg += seg) {
        for (int start = 0; start < len; start += seg + seg) {
            int low = start, mid = min(start + seg, len), high = min(start + seg + seg, len);
            int k = low;
            int start1 = low, end1 = mid;
            int start2 = mid, end2 = high;
            while (start1 < end1 && start2 < end2)
                b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
            while (start1 < end1)
                b[k++] = a[start1++];
            while (start2 < end2)
                b[k++] = a[start2++];
        }
        int* temp = a;
        a = b;
        b = temp;
    }
    if (a != arr) {
        for (int i = 0; i < len; i++)
            b[i] = a[i];
        b = a;
    }
    delete[] b;
}
void mergesort(int arr[], int low, int hight) //归并排序
{
    if (low < hight)
    {
        int mid = (low + hight) / 2;
        mergesort(arr, low, mid);          //对 a[low,mid]进行排序
        mergesort(arr, mid + 1, hight);    //对 a[mid+1,hight]进行排序
        merge(arr,hight-low+1);       //进行合并操作
    }
}
int main()
{
    int arr[N], n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    mergesort(arr, 0, n - 1);
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Script kid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值