栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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[i], numb[j]))
				exch(numb[i], numb[j]);
		}
	}

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

2、原位排序

#include
#define N 10

int main()
{
	int data[10] = { 5,7,1,0,9,6,8,3,2,4 }; //比如5是data的第一位,对应a中为3,
	int a[10]   =  { 3,2,8,7,9,0,5,1,6,4 }; //则data的第1个最小数据,在data的第3个
	int i, j, k;

	for (i = 0; i < 10; i++)
	{
		int numb = data[i];
		for (k = i; a[k] != i; k = a[j], a[j] = j)
		{
			j = k;
			data[k] = data[a[k]];
		}
		data[k] = numb;
		a[k] = k;  //对a排序
	}

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

	return 0;
}

3、关键字索引统计

适用于重复数据多的。

#include

int main()
{
	int a[15] = { 0,3,3,0,1,1,0,3,0,2,0,1,1,2,0 }; //0有6个,1有4个,2有2个,3有3个。
	int i, j, b[15] = { 0 }, c[15];
	
	//对a中数据统计出现的次数,记录在b[a+1]中,如0,有6个,则b[1] = 6
	for (i = 0; i < 15; i++)
		b[a[i]+1]++;
	
	//输出数组b
	printf("第一次循环数组b:");
	for (i = 0; i < 15; i++)
		printf("%-3d", b[i]);
	printf("n");

	//确定a中数据对应c数组中的位置范围,如0,在c中的位置为0~~5
	for (i = 1; i < 15; i++)
		b[i] = b[i] + b[i - 1];

	//输出数组b
	printf("第二次循环数组b:");
	for (i = 0; i < 15; i++)
		printf("%-3d", b[i]);
	printf("n");

	//把a的数据,在c中排好
	for (i = 0; i < 15; i++)
		c[b[a[i]]++] = a[i];  //数组b中的数据会变

	printf("第三次循环数组b:");
	for (i = 0; i < 15; i++)
		printf("%-3d", b[i]);
	printf("n");
	
	for (i = 0; i < 15; i++)
		a[i] = c[i];

	printf("          数组a:");
	for (i = 0; i < 15; i++)
		printf("%-3d", a[i]);
	printf("n");
	
}

4、快速排序
#include
#define less(A,B) (A) < (B)                  //比较,A= j)
			break;
		exch(a[i], a[j]);
	}
	exch(a[i], a[end]);
	return i;
}

5、三路划分的快速排序

适用于重复数据多的。

#include
#define less(A,B) (A) < (B)                  //比较,A= j)
			break;
		exch(a[i], a[j]);

		if (a[i] == v) {
			p++;
			exch(a[p], a[i]);
		}
		if (v == a[j]) {
			q--;
			exch(a[q], a[j]);
		}
	}

	exch(a[i], a[end]);

	for (int i = 0; i < 15; i++)
	{
		printf("%d  ", a[i]);
	}
	printf("n");

	j = i - 1;
	i = i + 1;

	for (k = head; k < p; k++, j--) {
		exch(a[k], a[j]);
	}
	for (k = end - 1; k > q; k--, i++) {
		exch(a[k], a[i]);
	}

	QuickSort(a, head, j);
	QuickSort(a, i, end);
}

1、运行输出

1  1  3  4  1  2  3  4  2  3  4  0  0  1  2 //首先先确定元素位置 .
2  1  1  0  1  0  1  2  3  3  4  3  4  2  4 //再分为三路,把比该数据大的放右边,小的放左边.
1  0  0  1  1  1  2  2  3  3  4  3  4  2  4 //再递归到 end <= head.
0  0  1  1  1  1  2  2  3  3  4  3  4  2  4
0  0  1  1  1  1  2  2  3  3  4  3  4  2  4
0  0  1  1  1  1  2  2  3  3  2  3  4  4  4
0  0  1  1  1  1  2  2  2  3  3  3  4  4  4
0  0  1  1  1  1  2  2  2  3  3  3  4  4  4
0  0  1  1  1  1  2  2  2  3  3  3  4  4  4
0  0  1  1  1  1  2  2  2  3  3  3  4  4  4

时间可以磨平所有棱角!

 

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

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

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