八大排序算法详解(通俗易懂)


前言

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面,一个优秀的算法可以节省大量的资源。


一、八大排序算法:

1.直接插入排序:

直接插入排序就是把待排序的元素逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

实际中我们玩扑克牌时,就用了插入排序的思想
在这里插入图片描述
动图演示:
在这里插入图片描述
那比如给我们一段序列,代码如何实现呢?
我们可以把第一个元素看成有序序列(一个元素序列必然有序)进行多次单趟插排

void InsertSort(int* arr, int size)//直接插入排序
{
   
	for (int i = 0; i < size - 1; i++)
	{
   
		//单趟插入排序
		//基本思想:[0,end]区间值为有序
		int end = i;
		int tmp = arr[end + 1];
		while (end >= 0)
		{
   
			if (tmp < arr[end])
			{
   
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
   
				break;//在这里break出去再去赋值tmp是为了防止最后一次end = -1进不来赋值
			}
		}
		arr[end + 1] = tmp;
	}
}

2.希尔排序:

希尔排序是对直接插入排序的优化,它对序列先进行多次预排序使之接近有序,因为最后接近有序使用直接插入排序非常快。
在这里插入图片描述
如图所示:

  • 当gap越大,预排序越快,但是越不接近有序
  • 当gap越小,数据处理越慢,越接近有序
  • 当gap为1即直接插入排序

如下代码所示:所以我们可以对gap进行动态改变

void ShellSort(int* arr, int size)//希尔排序
{
   
	int gap = size;
	//多次预排+最后一次直接插入排序
	while (gap > 1)
	{
   
		gap = gap / 3 + 1;//控制最后一次进来gap为1进行直接插入排序
		for (int i = 0; i < size - gap; i++)
		{
   
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
   
				if (tmp < arr[end])
				{
   
					arr[end + 
  • 45
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
C语言中常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。 1. 冒泡排序(Bubble Sort):比较相邻两个元素大小,如果顺序不对就交换位置,一次遍历后最大的元素会“冒泡”到最后面。重复执行遍历,直到全部有序。示例代码: ``` void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序(Selection Sort):每次从未排序的元素中选出最小的一个,放到已排序的末尾。重复执行遍历,直到全部有序。示例代码: ``` void selectionSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } ``` 3. 插入排序(Insertion Sort):将未排序的元素逐个插入到已排序的合适位置,重复执行遍历,直到全部有序。示例代码: ``` void insertionSort(int arr[], int n) { for (int i = 1; i < n; i++) { int temp = arr[i]; int j = i; while (j > 0 && arr[j - 1] > temp) { arr[j] = arr[j - 1]; j--; } arr[j] = temp; } } ``` 4. 快速排序(Quick Sort):选一个枢轴元素,将小于它的元素放到左边,大于它的元素放到右边,然后递归地对左右两边进行快速排序。示例代码: ``` void quickSort(int arr[], int left, int right) { if (left >= right) { return; } int i = left, j = right; int pivot = arr[left]; while (i < j) { while (i < j && arr[j] >= pivot) { j--; } arr[i] = arr[j]; while (i < j && arr[i] <= pivot) { i++; } arr[j] = arr[i]; } arr[i] = pivot; quickSort(arr, left, i - 1); quickSort(arr, i + 1, right); } ``` 5. 归并排序(Merge Sort):将已排序的两个子序列合并成一个有序序列,递归地对子序列进行归并排序,直到排序完成。示例代码: ``` void merge(int arr[], int left, int mid, int right) { int temp[right - left + 1]; int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int p = 0; p < k; p++) { arr[left + p] = temp[p]; } } void mergeSort(int arr[], int left, int right) { if (left >= right) { return; } int mid = (left + right) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杯浅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值