十大排序之插入排序与归并排序

Posted 水番正文

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十大排序之插入排序与归并排序相关的知识,希望对你有一定的参考价值。

十大排序的其他几个排序还是很有意思,一开始看算法导论的时候这两个是我自己手打实现的,其他打的快速排序、堆排序什么是直接看别人的代码,最近复习各种排序最后看到这两个,心中五味杂陈,以前打的什么shit代码,今天重写了当初的代码,正好最近也准备看各种加密算法的语言实现,特此专栏 首篇。

一:插入排序

#include<stdio.h>

#define SIZE 10
void Insertion_Sort(int *);
void Print(int *);

int main(void)
{
	int ar[SIZE] = {2, 3, 6, 8, 9, 0, 1, 4, 5, 7};
	
	printf("Befor sort:");
	Print(ar);
	Insertion_Sort(ar);
	printf("\\nThen:      ");
	Print(ar);	
	
	return 0;
} 

void Insertion_Sort(int * arr)
{
	int i, j, key;
	
	for(j = 1; j < SIZE; j++)
	{
			key = arr[j];
			i = j - 1;
			while(i >= 0 && arr[i] > key)  //降序还是升序就是看arr[i] <或> key的符号 
			{
				arr[i+1] = arr[i];			//所有数据往后移一位,将最小的那位- 
				i = i - 1;
			}
			arr[i+1] = key;					// -赋值到判断完最底的那位 
	} 
} 

void Print(int * ar)
{
	int i;
	
	for(i = 0; i < SIZE; i++)
		printf("%d ",ar[i]);
}

二:归并排序

#include <stdio.h>

#define SIZE 10
#define KING 10000 
void Merge_Sort(int *, int, int);
void Merge(int *, int, int, int);
void Print(int * ar);

int main(void)
{
	int ar[SIZE] = {2, 3, 6, 8, 9, 0, 1, 4, 5, 7};
	
	printf("Befor sort:");
	Print(ar);
	Merge_Sort(ar, 0, sizeof(ar)/sizeof(int) - 1);
	printf("\\nThen:      ");
	Print(ar);
	
	return 0;
}

void Merge_Sort(int * ar, int p, int r)
{
	int q;
	
	if(p < r) 
	{
		q = (p + r) / 2;
		Merge_Sort(ar, p, q);
		Merge_Sort(ar, q + 1, r);
		Merge(ar, p, q, r);
	}
}

void Merge(int * a, int p, int q, int r)
{		
	int n1 = q - p + 1;			//前半段长度  从0开始所以要 + 1 
	int n2 = r - q;				//后半段长度
	int al[n1+1], ar[n2+1];		//设置对半数组 +1位长度放哨兵 
	int i, j, k;

	for(i = 0; i < n1; i++)	
	{
		al[i] = a[p+i];			//原数组前半段从p开始 
	}
	for(j = 0; j < n2; j++)	
	{
		ar[j] = a[q+j+1];		//原数组后半段从q开始 
	} 
	al[n1] = KING;					//哨兵位 刚好就是定义数组时的长度 -1 因为从0开始 
	ar[n2] = KING;
	i = 0;
	j = 0;
	for(k = p; k <= r; k++)
	{
		if (al[i] <= ar[j])				//如果左边数组的数 小于 右边数组的数 
		{
			a[k] = al[i];				//将小的排序到原数组 
			i++;
		}
		else							//ar[j] <= al[i]
		{
			a[k] = ar[j];
			j++;	
		}
	}
}

void Print(int * ar)
{
	int i;
	
	for(i = 0; i < SIZE; i++)
		printf("%d ",ar[i]);
}

之前的打的归并排序版本是没有递归归并的,说到底还是用空间换时间的一种排序,很喜欢作者这句话,和快速排序很像,一开始想那岂不是归并排序更好点,但结合代码量和空间还有时间代价,快速排序是最好的!(快速排序属实有意思其他几个当初看的时候也很神奇)

这两个算法比较简单,大部分思路还是源自算法导论的模型,站在巨人肩膀上反复复习,所以就不写什么思路。

呜呼今天长城杯做出逆向题了。--9.18

以上是关于十大排序之插入排序与归并排序的主要内容,如果未能解决你的问题,请参考以下文章

[新星计划] Python手撕代码 | 十大经典排序算法

[新星计划] Python手撕代码 | 十大经典排序算法

十大排序之归并排序

十大经典排序之:归并排序 |桶排序

十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数-1

十大经典排序算法动画与解析,看我就够了!(配代码完全版)