数据结构(五)

常见的排序算法

内部排序

交换

冒泡:每一次运行总会将最小的或者最大的放到前面,如果需要交换,一直在交换
快速排序*:经过一次快排的过程,将待排序元素分成两部分:比基准小的,比基准大的,再分别对这两部分进行快
速排序
在这里插入图片描述

#include <stdio.h>
//快排操作,将数组分成两部分
int Quick_Pass(int arr[], int low, int high)
{
	int key = arr[low]; //找基准
	//从上往下依次比较
	while(low < high)
	{
		while(low < high && arr[high] > key)
		{
			//往前走
			high--;
		}
		//把后面遇到的比key小的值放入到前面
		arr[low] = arr[high];
		while(low < high && arr[low] <= key)
		{
			//往后走
			low++;
		}
		//将前面的比key大的值放入盗后面
		arr[high] = arr[low];
	}
	//比较完了,low == high
	//基准入队
	arr[low] = key;
	return low;
}
//快速排序
void Quick_Sort(int arr[], int low, int high)
{
	if(low >= high) return ;
	//执行一次快排操作
	int mid = Quick_Pass(arr, low, high);
	//左便
	Quick_Sort(arr, low, mid-1);
	//右边
	Quick_Sort(arr, mid+1, high);
}
int main(int argc, const char *argv[])
{
	int arr[13] = {55, 22, 34, 12, 99, 76, 38, 65, 29, 35, 11, 36, 74};
	printf("排序前:");
	for(int i=0; i<13; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	//排序
	Quick_Sort(arr, 0, 12);
	printf("排序后:");
	for(int i=0; i<13; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

插入

直接插入:重构链表
折半插入:原理同排序二叉树的插入,只是对象是一个有序的顺序表
希尔排序:增量,逐渐减少的,直到增量为1为止

在这里插入图片描述

选择

简单选择:每一次运行总会将最小的或者最大的放到前面,如果需要交换,只交换一次
堆(大根堆,小根堆):根结点的值>=左右孩子的值 根节点的值<=左右孩子的值
在Linux下,系统定时器使用小根堆来管理定时器事件。小根堆是一种数据结构,可以快速找到最小值。

归并

在这里插入图片描述

当然可以。下面是一个使用C语言编写的简单归并排序算法示例。归并排序是一种分治算法,它的核心思想是将一个
大问题分解成多个小问题,然后递归地解决这些小问题,最后将结果合并起来。
#include <stdio.h>
void merge(int arr[], int left, int mid, int right) {
	int n1 = mid - left + 1;
	int n2 = right - mid;
	int L[n1], R[n2];
	for (int i = 0; i < n1; i++)
		L[i] = arr[left + i];
	for (int j = 0; j < n2; j++)
		R[j] = arr[mid + 1 + j];
	int i = 0;
	int j = 0;
	int k = left;
	while (i < n1 && j < n2) {
		if (L[i] <= R[j]) {
			arr[k] = L[i];
			i++;
		} else {
			arr[k] = R[j];
			j++;
		}
		k++;
	}
	while (i < n1) {
		arr[k] = L[i];
		i++;
		k++;
	}
	while (j < n2) {
		arr[k] = R[j];
		j++;
		k++;
	}
}
void merge_sort(int arr[], int left, int right) {
	if (left >= right)
		return;
	int mid = left + (right - left) / 2;
	merge_sort(arr, left, mid);
	merge_sort(arr, mid + 1, right);
	merge(arr, left, mid, right);
}

基数

在这里插入图片描述

外部排序

基于归并的

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值