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