栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言:冒泡排序、选择排序、插入排序、希尔排序、归并排序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言:冒泡排序、选择排序、插入排序、希尔排序、归并排序

目录

1、冒泡排序

2、选择排序

3、插入排序

4、希尔排序

5、归并排序


排序算法图解

1、冒泡排序
#include

#define comp(A,B) (A)>(B)
#define exch(A,B) {int c = A; A = B; B = c;}

int main(void)
{
	int i, j;
	int numb[10];
	for (i = 0; i < 10; i++){
		scanf_s("%d", &numb[i]);
	}

	for (i = 0; i < 10; i++){
		for (j = i + 1; j < 10; j++){
			if (comp(numb[j-1], numb[j]))
				exch(numb[j], numb[j-1]);
		}
	}

	for (i = 0; i < 10; i++){
		printf("%d  ", numb[i]);
	}
}

2、选择排序
#include

#define comp(A,B) (A)>(B)  //如果A>B则返回1,否则为0.
#define exch(A,B) {int c = A; A = B; B = c;}

int main(void)
{
	int i, j, min;
	int numb[10];
	for (i = 0; i < 10; i++){
		scanf_s("%d", &numb[i]);
	}

	for (i = 0; i < 9; i++){
		min = i;
		for (j = i + 1; j < 10; j++){
			if (comp(numb[min], numb[j]))
				min = j;
		}
		exch(numb[i], numb[min]);
	}

	for (i = 0; i < 10; i++){
		printf("%d  ", numb[i]);
	}
}

3、插入排序
#include

#define comp(A,B) (A)>(B)
#define exch(A,B) {int c = A; A = B; B = c;}

int main(void)
{
	int i, j, a;
	int numb[10];
	for (i = 0; i < 10; i++){
		scanf_s("%d", &numb[i]);
	}

	for (i = 9; i > 0; i--){
		if (comp(numb[i-1], numb[i]))
			exch(numb[i-1], numb[i]);
	}
	for (i = 2; i < 10; i++){
		j = i;
		a = numb[i];
		while (comp(numb[j - 1], a)){
			numb[j] = numb[j - 1];
			j--;
		}
		numb[j] = a;
	}

	for (i = 0; i < 10; i++){
		printf("%d  ", numb[i]);
	}
}

4、希尔排序

      h的值是不可以随意确定的,如果h为1、2、4、8······就会出现有些位置重复判断,有些位置始终不能判断;就好像奇数得不到判断,偶数重复判断,会降低运行效率。

#include
#define less(A,B) A < B
#define exch(A,B) {int c = A; A = B; B = c;}
int main()
{
	int a[20];
	int i, j, h;
	for (i = 0; i < 20; i++){
		scanf_s("%d", &a[i]);
	}

	for (h = 0; h <= 20 / 3; h = 3 * h + 1);//h1=1; h2=4; h3=13; h4=40
	
	for (h = h; h > 0; h = h / 3){
		printf("%dn", h);
		for (i = h; i < 20; i++){
			j = i;
			int v = a[i];
			while (j >= h && less(v, a[j - h])){
				a[j] = a[j - h];
				j = j - h;
			}
			a[j] = v;
		}
		
		for (int i = 0; i < 20; i++){
			printf("%-4d", a[i]);
		}
		printf("n");
	}

}

5、归并排序

    本程序是将a数组作选择排序,b数组作插入排序。最后在归并到c数组中。

    也可以将a作归并排序成一个有序数组,从1个1个开始归并,就有以2个为单位的部分有序,然后2个2个归并,4个4个归并·····直到等于a数组的个数。

#include
#define less(A,B) (A) < (B)
#define exch(A,B) {int c=A; A = B, B = c;}

int main()
{
	int a[5] = { 4,6,2,9,5 };
	int b[10] = { 0,5,9,3,1,7,2,13,3,6 };
	int c[15];
	int i, j, k;

	
	for (i = 0; i < 5; i++){
		int numb = i;
		for (j = i + 1; j < 5; j++)
		{
			if (less(a[j],a[numb]))
				numb = j;
		}
		exch(a[i], a[numb]);
	}

	printf("a: ");
	for (i = 0; i < 5; i++){
		printf("%d  ", a[i]);
	}
	printf("n");
	
	
	for (i = 9; i > 0; i--){
		if (less(b[i], b[i - 1]))
			exch(b[i], b[i - 1]);
	}
	for (i = 2; i < 10; i++){
		j = i;
		int numb = b[i];
		while (less(numb, b[j - 1])){
			b[j] = b[j - 1];
			j--;
		}
		b[j] = numb;
	}

	printf("b: ");
	for (i = 0; i < 10; i++){
		printf("%d  ", b[i]);
	}
	printf("n");

	//两个数组已经有序,再将其排在c中
	for (k = 0, i = 0, j = 0; k < 15; k++){
		if (i == 5)
		{
			c[k] = b[j++];
			continue;
		}
		if (j == 10)
		{
			c[k] == a[i++];
			continue;
		}
		c[k] = less(a[i], b[j]) ? a[i++]: b[j++];
	}

	printf("c: ");
	for (i = 0; i < 15; i++){
		printf("%d  ", c[i]);
	}
}

 不去打扰便是最好的守护!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935084.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号