八大排序算法的实现

10 篇文章 0 订阅
7 篇文章 0 订阅

1.插入排序—直接插入排序

include <stdio.h>

void swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
	return;
}

void sort_insert(int n, int seq[])
{
	if (n < 2)
		return;

	int i, k;
	for (k = 1; k < n; ++ k)
	{
		for (i = k; i > 0; -- i)
		{
			if (seq[i] >= seq[i - 1])
				break;
			else
				swap(&seq[i], &seq[i - 1]);
		}
	}

	return;
}

void print(int n, int seq[])
{
	for (int i = 0; i < n; ++ i)
	{
		printf("%d ", seq[i]);
	}
	printf("\n");
}
int main()
{
	int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
	print(10, seq);

	sort_insert(10, seq);
	print(10, seq);
	return 0;
}


2.插入排序—希尔排序

#include <stdio.h>

void swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
	return;
}

void sort_shell(int n, int seq[])
{
	if (n < 2)
		return;

	int i, j, k;
	k = n / 2;
	while (k > 0)
	{
		for (j = k; j < n; j += k)
		{
			for (i = j; i >= k; i -= k)
			{
				if (seq[i] >= seq[i - k])
					break;
				else
					swap(&seq[i], &seq[i - k]);
			}
		}

		k /= 2;
	}

	return;
}

void print(int n, int seq[])
{
	for (int i = 0; i < n; ++ i)
	{
		printf("%d ", seq[i]);
	}
	printf("\n");
}

int main()
{
	int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
	print(10, seq);

	sort_shell(10, seq);
	print(10, seq);
	return 0;
}


3.选择排序—简单选择排序

include <stdio.h>

void sort_select(int n, int seq[])
{
	if (n < 2)
		return;

	int i, j, k, tmp;
	for (i = 0; i < n; ++ i)
	{
		tmp = seq[i];
		k = i;
		for (j = i; j < n; ++ j)
		{
			if (tmp > seq[j])
			{
				tmp = seq[j];
				k = j;
			}
		}

		if (k != i)
		{
			seq[k] = seq[i];
			seq[i] = tmp;
		}
	}

	return;
}

void print(int n, int seq[])
{
	for (int i = 0; i < n; ++ i)
	{
		printf("%d ", seq[i]);
	}
	printf("\n");
}

int main()
{
	int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
	print(10, seq);

	sort_select(10, seq);
	print(10, seq);
	return 0;
}


4.选择排序—堆排序

#include <stdio.h>

void swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
	return;
}

void heap_adjust(int k, int n, int seq[])
{
	int i, child;
	for (i = k; 2 * i + 1 < n; i = child)
	{
		child = 2 * i + 1;
		if (child + 1 < n && seq[child] < seq[child + 1])
			++ child;

		if (seq[i] < seq[child])
			swap(&seq[i], &seq[child]);
	}

	return;
}

void sort_heap(int n, int seq[])
{
	if (n < 2)
		return;

	int i;
	for (i = n / 2 - 1; i >= 0; -- i)
	{
		heap_adjust(i, n, seq);
	}

	for (i = n - 1; i > 0; -- i)
	{
		swap(&seq[0], &seq[i]);
		heap_adjust(0, i, seq);
	}

	return;
}

void print(int n, int seq[])
{
	for (int i = 0; i < n; ++ i)
	{
		printf("%d ", seq[i]);
	}
	printf("\n");
}

int main()
{
	int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
	print(10, seq);

	sort_heap(10, seq);
	print(10, seq);
	return 0;
}


5.交换排序—冒泡排序

#include <stdio.h>

void swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
	return;
}

void sort_bubble(int n, int seq[])
{
	if (n < 2)
		return;

	int i, j, flag;
	for (i = n - 1; i > 0; -- i)
	{
		flag = 0;
		for (j = 0; j < i; ++ j)
		{
			if (seq[j] > seq[j + 1])
			{
				flag = 1;
				swap(&seq[j], &seq[j + 1]);
			}
		}

		if (!flag)
			break;
	}

	return;
}

void print(int n, int seq[])
{
	for (int i = 0; i < n; ++ i)
	{
		printf("%d ", seq[i]);
	}
	printf("\n");
}

int main()
{
	int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
	print(10, seq);

	sort_bubble(10, seq);
	print(10, seq);
	return 0;
}


6.交换排序—快速排序

#include <stdio.h>

void sort_quick(int start, int end, int seq[])
{
	if (end - start < 1)
		return;

	int i, j, tmp;
	tmp = seq[start];
	i = start;
	j = end;
	while (i < j)
	{
		while (i < j && seq[j] >= tmp)
			-- j;
		seq[i] = seq[j];
		while (i < j && seq[i] <= tmp)
			++ i;
		seq[j] = seq[i];

	}

	seq[i] = tmp;
	sort_quick(start, i - 1, seq);
	sort_quick(i + 1, end, seq);
	return;

	
}

void print(int n, int seq[])
{
	for (int i = 0; i < n; ++ i)
	{
		printf("%d ", seq[i]);
	}
	printf("\n");
}

int main()
{
	int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
	print(10, seq);

	sort_quick(0, 9, seq);
	print(10, seq);
	return 0;
}


7.归并排序

#include <stdio.h>

void sort_merge(int start, int end, int seq[], int tmp[])
{
	if (end - start < 1)
		return;

	int i, j, k, mid;
	mid = (start + end) / 2;
	sort_merge(start, mid, seq, tmp);
	sort_merge(mid + 1, end, seq, tmp);
	i = start;
	j = mid + 1;
	k = start;
	while (i <= mid && j <= end)
	{
		if (seq[i] > seq[j])
			tmp[k ++] = seq[j ++];
		else
			tmp[k ++] = seq[i ++];
	}

	while (i <= mid)
		tmp[k ++] = seq[i ++];

	while (j <= end)
		tmp[k ++] = seq[j ++];
	
	for (i = start; i <= end; ++ i)
		seq[i] = tmp[i];

	return;
}

void print(int n, int seq[])
{
	for (int i = 0; i < n; ++ i)
	{
		printf("%d ", seq[i]);
	}
	printf("\n");
}

int main()
{
	int seq[10] = {1, 8, 5, 6, 9, 2, 3, 10, 4, 7};
	int tmp[10];
	print(10, seq);

	sort_merge(0, 9, seq, tmp);
	print(10, seq);
	return 0;
}


8.基数排序

#include <stdio.h>

int tmp[10][11];

int getkey(int num, int index)
{
	int i, temp = 1;
	for (i = 1; i < index; ++ i)
		temp *= 10;

	return (num / temp) % 10;
}

void sort_radix(int ckey, int nkey, int n, int seq[])
{
	if (n < 2)
		return;

	int i, j, k, l, key;
	for (i = ckey; i < nkey; ++ i)
	{
		for (j = 0; j < 10; ++ j)
			tmp[j][0] = 0;

		for (j = 0; j < n; ++ j)
		{
			key = getkey(seq[j], i);
			k = tmp[key][0];
			tmp[key][k + 1] = seq[j];
			++ tmp[key][0];
		}

		for (j = 0, l = 0; j < 10; ++ j)
			for (k = 0; k < tmp[j][0]; ++ k)
			{
				seq[l ++] = tmp[j][k + 1];
			}
	}

	return;
}

void print(int n, int seq[])
{
	for (int i = 0; i < n; ++ i)
	{
		printf("%d ", seq[i]);
	}
	printf("\n");
}

int main()
{
	int seq[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
	print(10, seq);

	sort_radix(1, 3, 10, seq);
	print(10, seq);
	return 0;
}


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值