排序介绍和学习:史上最全的排序算法

一、冒泡排序

#include<sys/timeb.h> //这个可以精确到毫秒

#define MAX 10000

//获取精确的时间函数
long getSystemTime()
{
	struct timeb tb;
	ftime(&tb);
	return tb.time * 1000 + tb.millitm;
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒

#define MAX 10000

//获取精确的时间函数
long getSystemTime()
{
	struct timeb tb;
	ftime(&tb);
	return tb.time * 1000 + tb.millitm;
}

//交换函数
void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//冒泡排序
void BubbleSort(int arr[],int len)
{
	for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
	{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
		{
			if (arr[j] > arr[j+1])
			{
				swap(&arr[j], &arr[j+1]);
			}
		}
	}		
}

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


int main(void)
{
	int arr[MAX];
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	printf("排序前:\n  ");
	PrintArray(arr,MAX);
	long tstart = getSystemTime();
	BubbleSort(arr,MAX);
	long tend = getSystemTime(); 
	printf("排序后:\n  ");
	PrintArray(arr, MAX);
	printf("冒泡排序%d个元素,所需时间%ld\n",MAX,tend-tstart);

	system("pause");
	return 0;
}

二、选择排序

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒

#define MAX 100000

//获取精确的时间函数
long getSystemTime()
{
	struct timeb tb;
	ftime(&tb);
	return tb.time * 1000 + tb.millitm;
}

//交换函数
void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//冒泡排序
void BubbleSort(int arr[],int len)
{
	for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
	{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
		{
			if (arr[j] > arr[j+1])
			{
				swap(&arr[j], &arr[j+1]);
			}
		}
	}		
}

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

//选择排序
void SelectSort(int arr[],int len)
{
	//选择排序是不是减少交换次数
	for (int i = 0; i < len; i++)	
	{
		int min = i;
		for (int j = i + 1; j < len; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		if (min != i)
		{
			swap(&arr[min], &arr[i]);
		}

	}
}
int main(void)
{
	int arr[MAX];
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	//冒泡排序
	long tbubble_start = getSystemTime();
	BubbleSort(arr,MAX);
	long tbubble_end = getSystemTime();
	printf("冒泡排序%d个元素,所需时间%ld\n",MAX, tbubble_end- tbubble_start);

	//选择排序
	long tselect_start = getSystemTime();
	SelectSort(arr, MAX);
	long tselect_end = getSystemTime();
	printf("冒泡排序%d个元素,所需时间%ld\n", MAX, tselect_end - tselect_start);

	system("pause");
	return 0;
}

三、插入排序

在这里插入图片描述

插入排序

//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
在这里插入图片描述
将序列分为两部分,一部分是有序的,一部分是无序的。
核心代码:

//插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
void InsertSort(int arr[], int len)
{
	int j=0;
	for (int i = 1; i < len; i++)
	{
		if (arr[i] < arr[i - 1])
		{
			int temp = arr[i];
			for (int j = i - 1; j >= 0 && temp < arr[j]; j--)//两个判断条件
			{
				arr[j + 1] = arr[j];
			}
			arr[j + 1] = temp;
		}
	}
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒

#define MAX 10000

//获取精确的时间函数
long getSystemTime()
{
	struct timeb tb;
	ftime(&tb);
	return tb.time * 1000 + tb.millitm;
}

//交换函数
void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//冒泡排序
void BubbleSort(int arr[],int len)
{
	for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
	{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
		{
			if (arr[j] > arr[j+1])
			{
				swap(&arr[j], &arr[j+1]);
			}
		}
	}		
}

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

//选择排序
void SelectSort(int arr[],int len)
{
	//选择排序是不是减少交换次数
	for (int i = 0; i < len; i++)	
	{
		int min = i;
		for (int j = i + 1; j < len; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		if (min != i)
		{
			swap(&arr[min], &arr[i]);
		}

	}
}

//插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
void InsertSort(int arr[], int len)
{
	int j=0;
	for (int i = 1; i < len; i++)
	{
		if (arr[i] < arr[i - 1])
		{
			int temp = arr[i];
			for (int j = i - 1; j >= 0 && temp < arr[j]; j--)//两个判断条件
			{
				arr[j + 1] = arr[j];
			}
			arr[j + 1] = temp;
		}
	}
}
int main(void)
{
	int arr[MAX];
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	//冒泡排序
	long tbubble_start = getSystemTime();
	BubbleSort(arr,MAX);
	long tbubble_end = getSystemTime();
	printf("冒泡排序%d个元素,所需时间%ld\n",MAX, tbubble_end- tbubble_start);

	//选择排序
	long tselect_start = getSystemTime();
	SelectSort(arr, MAX);
	long tselect_end = getSystemTime();
	printf("冒泡排序%d个元素,所需时间%ld\n", MAX, tselect_end - tselect_start);
	printf("------------------------\n");;
	//PrintArray(arr, MAX);
	//InsertSort(arr, MAX);
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	long tinsert_start = getSystemTime();
	InsertSort(arr, MAX);
	long tinsert_end = getSystemTime();
	printf("冒泡排序%d个元素,所需时间%ld\n", MAX, tinsert_end - tinsert_start);

	system("pause");
	return 0;
}

在这里插入图片描述
如图可以看出来,各种排序的算法快慢!
对于插入排序,元素的序列基本有序的情况下
插入排序在数据量比较小的情况下,效果较好!
由此:可以思考
分组,插入排序
先分组 然后对每一组分别进行插入排序

希尔排序

在这里插入图片描述
核心代码:

//希尔排序
void ShellSort(int arr[], int len)
{
	int i, j=0,k=0;
	int increasement = len;
	do {
		//确定分组的增量
		increasement = increasement / 3 + 1;
		for (i = 0; i < increasement; i++)
		{
			for (j = i + increasement; j < len; j += increasement)
			{
				if (arr[j] < arr[j - increasement])
				{
					int temp = arr[j];
					for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement)
					{
						arr[k + increasement] = arr[k];
					}
					arr[k + increasement] = temp;
				}
			}
		}
	} while (increasement > 1);
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒

#define MAX 50000

//获取精确的时间函数
long getSystemTime()
{
	struct timeb tb;
	ftime(&tb);
	return tb.time * 1000 + tb.millitm;
}

//交换函数
void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//冒泡排序
void BubbleSort(int arr[],int len)
{
	for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
	{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
		{
			if (arr[j] > arr[j+1])
			{
				swap(&arr[j], &arr[j+1]);
			}
		}
	}		
}

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

//选择排序
void SelectSort(int arr[],int len)
{
	//选择排序是不是减少交换次数
	for (int i = 0; i < len; i++)	
	{
		int min = i;
		for (int j = i + 1; j < len; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		if (min != i)
		{
			swap(&arr[min], &arr[i]);
		}

	}
}

//插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
void InsertSort(int arr[], int len)
{
	int j=0;
	for (int i = 1; i < len; i++)
	{
		if (arr[i] < arr[i - 1])
		{
			int temp = arr[i];
			for (int j = i - 1; j >= 0 && temp < arr[j]; j--)//两个判断条件
			{
				arr[j + 1] = arr[j];
			}
			arr[j + 1] = temp;
		}
	}
}

//希尔排序
void ShellSort(int arr[], int len)
{
	int i, j=0,k=0;
	int increasement = len;
	do {
		//确定分组的增量
		increasement = increasement / 3 + 1;
		for (i = 0; i < increasement; i++)
		{
			for (j = i + increasement; j < len; j += increasement)
			{
				if (arr[j] < arr[j - increasement])
				{
					int temp = arr[j];
					for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement)
					{
						arr[k + increasement] = arr[k];
					}
					arr[k + increasement] = temp;
				}
			}
		}
	} while (increasement > 1);
}
int main(void)
{
	int arr[MAX];
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	//冒泡排序
	long tbubble_start = getSystemTime();
	BubbleSort(arr,MAX);
	long tbubble_end = getSystemTime();
	printf("冒泡排序%d个元素,所需时间%ld\n",MAX, tbubble_end- tbubble_start);

	//选择排序
	long tselect_start = getSystemTime();
	SelectSort(arr, MAX);
	long tselect_end = getSystemTime();
	printf("选择排序%d个元素,所需时间%ld\n", MAX, tselect_end - tselect_start);
	printf("------------------------\n");
	//PrintArray(arr, MAX);
	//InsertSort(arr, MAX);
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	long tinsert_start = getSystemTime();
	InsertSort(arr, MAX);
	long tinsert_end = getSystemTime();
	printf("插入排序%d个元素,所需时间%ld\n", MAX, tinsert_end - tinsert_start);

	printf("------------------------\n");
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	long tShell_start = getSystemTime();
	ShellSort(arr,MAX);
	long eShell_end = getSystemTime();
	printf("Shell排序%d个元素,所需时间%ld\n", MAX, eShell_end - tShell_start);
	system("pause");
	return 0;
}

在这里插入图片描述
以上排序完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h> //这个可以精确到毫秒

#define MAX 50000

//获取精确的时间函数
long getSystemTime()
{
	struct timeb tb;
	ftime(&tb);
	return tb.time * 1000 + tb.millitm;
}

//交换函数
void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//冒泡排序
void BubbleSort(int arr[],int len)
{
	for (int i = 0; i < len - 1; i++)//i = 0; i<len - 1
	{ for (int j = 0; j < len - i - 1; j++) //j = 0; j<len - j - 1
		{
			if (arr[j] > arr[j+1])
			{
				swap(&arr[j], &arr[j+1]);
			}
		}
	}		
}

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

//选择排序
void SelectSort(int arr[],int len)
{
	//选择排序是不是减少交换次数
	for (int i = 0; i < len; i++)	
	{
		int min = i;
		for (int j = i + 1; j < len; j++)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		if (min != i)
		{
			swap(&arr[min], &arr[i]);
		}

	}
}

//插入排序
//基本有序的排列的情况下,效率是非常高的,或者元素的个数比较少的时候,效率也是比较高的
void InsertSort(int arr[], int len)
{
	int j=0;
	for (int i = 1; i < len; i++)
	{
		if (arr[i] < arr[i - 1])
		{
			int temp = arr[i];
			for (int j = i - 1; j >= 0 && temp < arr[j]; j--)//两个判断条件
			{
				arr[j + 1] = arr[j];
			}
			arr[j + 1] = temp;
		}
	}
}

//希尔排序
void ShellSort(int arr[], int len)
{
	int i, j=0,k=0;
	int increasement = len;
	do {
		//确定分组的增量
		increasement = increasement / 3 + 1;
		for (i = 0; i < increasement; i++)
		{
			for (j = i + increasement; j < len; j += increasement)
			{
				if (arr[j] < arr[j - increasement])
				{
					int temp = arr[j];
					for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement)
					{
						arr[k + increasement] = arr[k];
					}
					arr[k + increasement] = temp;
				}
			}
		}
	} while (increasement > 1);
}
int main(void)
{
	int arr[MAX];
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	//冒泡排序
	long tbubble_start = getSystemTime();
	BubbleSort(arr,MAX);
	long tbubble_end = getSystemTime();
	printf("冒泡排序%d个元素,所需时间%ld\n",MAX, tbubble_end- tbubble_start);

	//选择排序
	long tselect_start = getSystemTime();
	SelectSort(arr, MAX);
	long tselect_end = getSystemTime();
	printf("选择排序%d个元素,所需时间%ld\n", MAX, tselect_end - tselect_start);
	printf("------------------------\n");
	//PrintArray(arr, MAX);
	//InsertSort(arr, MAX);
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	long tinsert_start = getSystemTime();
	InsertSort(arr, MAX);
	long tinsert_end = getSystemTime();
	printf("插入排序%d个元素,所需时间%ld\n", MAX, tinsert_end - tinsert_start);

	printf("------------------------\n");
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}
	long tShell_start = getSystemTime();
	ShellSort(arr,MAX);
	long eShell_end = getSystemTime();
	printf("Shell排序%d个元素,所需时间%ld\n", MAX, eShell_end - tShell_start);
	system("pause");
	return 0;
}

(完!)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值