直接排序与快速插入排序

直接排序与快速插入排序

  • Test.c
  • Sort.h
  • Sort.c

Test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Sort.h"

void TestInsertSort()
{
	int a[] = { 9,1,2,5,7,4,8,6,3,5 };
	InsertSort(a, sizeof(a) / sizeof(a[0]));
	PrintArray(a, sizeof(a) / sizeof(a[0]));
}

void TestShellSort()
{
	int a[] = { 9,1,2,5,7,4,8,6,3,5 };
	ShellSort(a, sizeof(a) / sizeof(a[0]));
	PrintArray(a, sizeof(a) / sizeof(a[0]));
}


int main()
{
	//TestInsertSort();
	TestShellSort();
	return 0;
}

Sort.h

#define _CRT_SECURE_NO_WARNINGS 1

#include 
#include 
#include 

void PrintArray(int* a, int n);
void InsertSort(int* a, int n);
void ShellSort(int* a, int n);

Sort.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Sort.h"

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

//直接插入排序:
//插入排序的时间复杂度为:O(N^2)
//其最优情况为:顺序有序/接近顺序有序 O(N)
//最坏情况为:逆序 O(N^2)
void InsertSort(int* a, int n)
{
	//整体排序
	for (int i = 0; i < n - 1; i++)
	{
		//单趟排序
		// [0,end]有序,把end+1位置的值插入,保持有序
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}


//希尔排序【通俗来说为:分组插入排序/缩小增量排序】:a、预排序【让大的数据尽量排在后面,小的数据尽量排在前面】(接近顺序有序)  b、直接插入排序(有序)
//在希尔排序中:时间复杂度约为:O(N^1.3)/ O(N^logN)
//排升序时,gap越大,大的数更快到后面,小的数可以更快的到前面,但是越不接近有序。
//排升序时,gap越小,越接近有序的;当gap==1时,就是直接插入排序。
void ShellSort(int* a, int n)
{
	int gap = n;//gap为同组数据之间的间隙
	while (gap > 1)
	{
		//先进行多组预处理排序(gap>1时);最后当gap==1时,进行直接插入排序。
		gap = gap / 3 + 1;
		//gap组数据交替插入排序
		for (int i = 0; i < n - gap; i++)
		{
			//一个数据(间距为:gap)的插入排序
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

你可能感兴趣的:(数据结构)