【C语言】【新手易看懂的十大排序代码集】个人作业

以下是小白我翻看了n条大佬写的帖子,与《大话数据结构》这本书上的一些排序讲解,在几个与月同在的夜晚,滴干了眼药水(蛤蛤狗头警告)在本人的思路上肝出来的排序代码集,经测试无误才水帖上来(bug:你尽管运行 我负责打脸)有错误欢迎指出哦。

代码如下

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100  //数组的大小,可自行设置


/*---输出与置换操作---*/
void print(int* a);
void swap(int *a,int i, int j);

/*-----------排序方法----------*/

void sort1(int* a);//优化版冒泡排序
void sort2(int* a);//选择法排序
void sort3(int* a);//简单插入排序
void sort4(int* a);//折半插入排序
void sort5(int* a);//希尔排序
//堆排序
void sort6(int* a);
void sort6_siftdown(int *a,int i, int j);
//归并排序
void sort7(int* a);
void sort7_MSort(int* a, int frist, int last, int* temp);
void sort7_Merge(int* a, int frist, int mid, int last, int* temp);
//快速排序
void sort8(int* a);
void sort8_quick(int* a, int left, int right);
void sort9(int* a);//计数排序
void sort10(int* a);//基数排序

/*-----------------------------*/

/*---------测试数据------------*/
int* arry()
{
	int *a=(int *)malloc(sizeof(int)*MAX);
	for (int i = 0; i < MAX; i++) a[i]= rand();
	return a;
}
/*-----------------------------*/

输出与置换操作


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

void swap(int *a,int i, int j)
{
	int t;
	t = a[i]; a[i] = a[j]; a[j] = t;
}


优化版冒泡排序

void sort1(int* a)
{
	int i, j;
	for (i = 1; i < MAX; i++)
	{
		int flag = 1;
		for (j = 0; j < MAX - i; j++)
		{
			if (a[j] > a[j + 1]) { flag = 0; swap(a,j, j + 1); }
		}
		if (flag) break;
	}
}

选择法排序

void sort2(int* a)
{
	int i, j, max;
	for (i = 0; i < MAX; i++)
	{
		max = 0;
		for (j = 0; j < MAX - i; j++)
		{
			if (a[j] > a[max]) max = j;
		}
		swap(a,j - 1, max);
	}
}

简单插入排序

void sort3(int* a)
{
	int i, j, temp;
	for (i = 0; i < MAX - 1; i++)
	{
		if (a[i + 1] < a[i])
		{
			temp = a[i + 1];
			for (j = i; j >= 0; j--)
			{
				if (temp > a[j]) break;
				a[j + 1] = a[j];
			}
			a[j + 1] = temp;
		}
	}
}

折半插入排序

void sort4(int* a)
{
	int i, t, left, right, middle, temp;
	for (i = 0; i < MAX - 1; i++)
	{
		if (a[i + 1] < a[i])
		{
			temp = a[i + 1];
			left = 0; right = i;
			while (left <= right)
			{
				middle = (left + right) / 2;
				if (temp > a[middle]) left = middle + 1;
				else right = middle - 1;
			}
			if (a[middle] < temp) middle++;
			for (t = i; t >= middle; t--) a[t + 1] = a[t];
			a[middle] = temp;
		}
	}
}

希尔排序

void sort5(int* a)
{
	int increment = MAX, i, j, t, temp;
	do
	{
		increment = increment / 3 + 1;
		for (i = 0; i + increment < MAX; i += increment)
		{
			if (a[i + increment] < a[i])
			{
				temp = a[i + increment];
				for (j = i; j >= 0; j -= increment)
				{
					if (temp > a[j]) break;
					a[j + increment] = a[j];
				}
				a[j + increment] = temp;
			}
		}
	} while (increment > 1);
}

堆排序

void sort6(int* a)
{
	int i, j = MAX, t;
	for (i = j / 2 - 1; i >= 0; i--) sort6_siftdown(a,i, j);
	for (t = 0; t < MAX; t++)
	{
		swap(a,--j, 0);
		sort6_siftdown(a,0, j);
	}
}
void sort6_siftdown(int *a,int i, int j)
{
	int t, max;
	while (i * 2 + 1 < j)
	{
		max = i;
		if (a[i * 2 + 1] > a[i]) max = i * 2 + 1;
		if (i * 2 + 2 < j && a[i * 2 + 2] > a[max]) max = i * 2 + 2;
		if (max != i) { swap(a,i, max); i = max; }
		else break;
	}
}


归并排序

void sort7(int* a)
{
	int* temp = (int*)malloc(sizeof(int) * MAX);
	sort7_MSort(a, 0, MAX - 1, temp);
}

void sort7_MSort(int* a, int frist, int last, int* temp)
{
	if (frist < last)
	{
		int mid = (frist + last) / 2;
		sort7_MSort(a, frist, mid, temp);
		sort7_MSort(a, mid + 1, last, temp);
		sort7_Merge(a, frist, mid, last, temp);
	}
}


void sort7_Merge(int* a, int frist, int mid, int last, int* temp)
{
	int i = frist, j = mid + 1, k = 0, t;
	while (i <= mid && j <= last)
	{
		if (a[i] < a[j]) temp[k++] = a[i++];
		else temp[k++] = a[j++];
	}
	while(i <= mid) temp[k++] = a[i++];
	while (j <= last) temp[k++] = a[j++];
	for (t = 0; t < k; t++) a[t + frist] = temp[t];
}

快速排序

void sort8(int* a)
{
	sort8_quick(a, 0, MAX - 1);
}

void sort8_quick(int* a, int left, int right)
{
	if (left >= right) return;
	int temp = a[left], i = left, j = right;
	while (i != j)
	{
		while (a[j] >= temp && j > i) j--;
		while (a[i] <= temp && j > i) i++;
		if (j > i) swap(a,i, j);
	}
	swap(a,i, left);
	sort8_quick(a, left, i - 1); sort8_quick(a, i + 1, right);
}

计数排序

void sort9(int* a)
{
	int min = a[0], max = a[0], i;
	int* new_a = (int*)malloc(MAX * sizeof(int));
	for (i = 1; i < MAX; i++)
	{
		if (a[i] > max) max = a[i];
		if(a[i]<min) min = a[i];
	} 
	int* book = (int*)malloc((max - min + 1) * sizeof(int));
	for (i = 0; i < max - min + 1; i++)  book[i] = 0; 
	for (i = 0; i < MAX; i++) book[a[i] - min]+=1; 
	for (i = 1; i < max - min + 1; i++)  book[i] += book[i - 1]; 
	for (i = 0; i < MAX; i++)
	{
		new_a[book[a[i] - min] - 1] = a[i]; book[a[i]-min]--;
	}
	for (i = 0; i < MAX; i++) a[i] = new_a[i];
}

基数排序 (不适用于负数情况)

void sort10(int* a)
{
	int book[10][MAX+1], flag = 1, i, j = 1, t, k, temp;
	for (i = 0; i < 10; i++) book[i][MAX] = 0;
	while (flag)
	{
		flag = 0;
		for (i = 0; i < MAX;  i++)
		{
			if (a[i] / j % 10 != 0) flag = 1;
			temp = a[i] / j % 10;
			book[temp][book[temp][MAX]] = a[i];
			book[temp][MAX]++;
		}
		j *= 10;
		for (i = 0, k = 0; i < 10; i++)
		{
			for (t = 0; t < book[i][MAX]; t++) { a[k++] = book[i][t]; }
			book[i][MAX] = 0;
		}
	}
}

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值