首页 > 其他分享 >基尔排序——C语言描述

基尔排序——C语言描述

时间:2023-03-15 21:44:51浏览次数:59  
标签:Arr ---------- int C语言 ------- Test Incre 基尔 排序

基尔排序——C语言描述

目录

0 测试用例框架

https://blog.csdn.net/m0_59469991/article/details/127137119?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127137119%22%2C%22source%22%3A%22m0_59469991%22%7D

1 定义

算法思想:引入增量Incre(如Incre = Num / 2,不一定为最优),将原来的无序序列划分多个子序列,然后以增量Incre尺度进行插入排序,先使得多个无序子序列变得有序。当Incre为1时,该序列已经基本有序,然后进行一次完整的插入排序。

注意:

① 最外层循环控制增量的变化;

② 里面两层是与插入排序一致,中间那层的初始值应为Incre,最里面那层循环迭代,j -= Incre,j每次都需要减Incre.

2 代码

/*ShellSort*/
void ShellSort(int *Arr, int Num) {
	int i, j, Tmp, Incre;

	if ((Arr == NULL) || (Num <= 1)) {
		return ;
	}

	for (Incre = Num / 2; Incre > 0; Incre /= 2) {
		for (i = Incre; i < Num; i++) {
			if (Arr[i] < Arr[i - Incre]) {
				Tmp = Arr[i];
				for (j = i - Incre; (Arr[j] > Tmp) && (j >= 0); j -= Incre) {
					Arr[j + Incre] = Arr[j];
				}
				
				Arr[j + Incre] = Tmp;
			}
		}
	}
}

4 测试用例

void TestCmpArr(int *CmpArr, int Num, int *Arr) {
	int Index = 0;
	int CmpNum = 0;

	TestNum++;

	for (Index = 0; Index < Num; ++Index) {
		if (CmpArr[Index] == Arr[Index]) {
			CmpNum++;
		}
	}

	if (CmpNum != Num) {
		printf("Incorrect!\n");
		FaildNum++;
	}
	else {
		printf("Correct!\n");
		PassNum++;
	}
}

/*TestShellSort*/
void TestShellSort(void) {
	/*Test01: Normal*/
	int Arr01[] = { 1, 3, 2, 5, 4, 0 };
	int Num01 = 6;
	int CmpArr01[] = { 0, 1, 2, 3, 4, 5 };

	/*Test02: Normal*/
	int Arr02[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
	int Num02 = 8;
	int CmpArr02[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

	/*Test03: Two Mem*/
	int Arr03[] = { 1, 0 };
	int Num03 = 2;
	int CmpArr03[] = { 0, 1 };

	/*Test04: Only 1 Mem*/
	int Arr04[] = { 0 };
	int Num04 = 1;
	int CmpArr04[] = { 0 };

	printf("-------Test start----------\n");
	InitNum();

	/*Test01*/
	printf("\n-------Test 01----------\n");
	ShellSort(Arr01, Num01);
	PrintArr(Arr01, Num01);
	TestCmpArr(CmpArr01, Num01, Arr01);

	/*Test02*/
	printf("\n-------Test 02----------\n");
	ShellSort(Arr02, Num02);
	PrintArr(Arr02, Num02);
	TestCmpArr(CmpArr02, Num02, Arr02);

	/*Test03*/
	printf("\n-------Test 03----------\n");
	ShellSort(Arr03, Num03);
	PrintArr(Arr03, Num03);
	TestCmpArr(CmpArr03, Num03, Arr03);

	/*Test04*/
	printf("\n-------Test 04----------\n");
	ShellSort(Arr04, Num04);
	PrintArr(Arr04, Num04);
	TestCmpArr(CmpArr04, Num04, Arr04);

	/*Test Result*/
	printf("\n-------Test result----------\n");
	TestResult();
}

打印结果

-------Test start----------

-------Test 01----------

Arr[0] = 0

Arr[1] = 1

Arr[2] = 2

Arr[3] = 3

Arr[4] = 4

Arr[5] = 5

Correct!

-------Test 02----------

Arr[0] = 0

Arr[1] = 1

Arr[2] = 2

Arr[3] = 3

Arr[4] = 4

Arr[5] = 5

Arr[6] = 6

Arr[7] = 7

Correct!

-------Test 03----------

Arr[0] = 0

Arr[1] = 1

Correct!

-------Test 04----------

Arr[0] = 0

Correct!

-------Test result----------

Print test result;

TestNum = 4, PassNum = 4, FaildNum = 0

标签:Arr,----------,int,C语言,-------,Test,Incre,基尔,排序
From: https://www.cnblogs.com/meditatorss/p/17220190.html

相关文章

  • c语言学习日志——练习
    T:实现一段字符串从两端逐个向中间移动。code:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>intmain(){chararr1[]="Welcometo512";chara......
  • C语言输出狗头
    使用printf()函数输出样式#include<stdio.h>intmain(){printf("*ii.;9ABH,\n");printf("......
  • 排序算法 之 (快速排序)
    10.3、快速排序算法思想在待排序表[1...n]中任取一个元素pivot作为枢轴(基准,通常去首元素),通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-......
  • 排序算法 之 (冒泡排序)
    10.3、冒泡排序从后往前依次比较两个元素,如果后面小于前面就交换,每次都会寻找到其中最小的那个元素放到前面冒泡排序图解冒泡排序的C代码实现#include<stdio.h>#inc......
  • 排序算法 之 (简单选择排序)
    10.5、简单选择排序这个算法的思想很简单,每次选择从没有排序的元素中选择最小(大)元素放到到前(后)面简单选择排序是不稳定的简单选择排序代码实现#include<stdio.h>#i......
  • TZOJ 5795: 奖金 拓扑排序
    描述  由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,YaliCompany总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们......
  • 排序算法 之 (直接插入排序)
    10.6、堆排序对于n个关键字序列L[1...n],满足下面某一条性质,则称为堆(Heap)若满足:\(L(2i)\leL(i)\)且\(L(2i+1)\leL(i)\),\(1\lei\len\),大根堆(大顶堆)若满足:\(L(......
  • TZOJ 7690: 家谱树 拓扑排序
    描述 有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的孩子的信息。输出一个序列,使得每个人的后辈都比那个人后列出。 输入 第1行一个......
  • 机试 C语言C++字符串知识
    机试中对于字符串而言有两种风格的字符串C语言风格C++风格其中输入和输出最好使用C语言风格的字符串 本质上是数组。即字符数组。对字符串的操作最好使用C++语言......
  • 冒泡排序
     冒泡排序(BubbleSort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没......