10种排序算法笔记总结(一)插入排序、二分插入排序和希尔排序

总结10总排序算法

①直接插入排序

②二分插入排序 

③希尔排序 

④直接选择排序 

⑤ 堆排序 

⑥冒泡排序及其改进 

⑦快速排序

⑧归并排序 

⑨计数排序 

⑩基数排序

(PS)链表排序(插入排序,快速排序和归并排序)

应用:当数据量不大时选择插入或选择排序,不要用冒泡排序。其次,当数据量达尔优注重空间复杂度时选择快速排序和堆排序。再次,当数据量大而又允许使用较多附加空间是选择桶排序。最后,当腰在已排序数据上加若干新数据时选择(二分)插入排序。

①直接插入排序:

思想:每次将一个待排序数据对象按关键字码大小插入一个有序的数据序列中,得到一个新的容量增加一的有序数据序列,如此往复直到全部对象插入完毕为止。

数据对象在顺序表中存储,当插入第i个对象V[i]时,前面的i-1个元素V[0]、V[1]、...... 、V[i-1]已经有序。用第i个元素的关键码同已经存在的i-1个元素的关键码从后往前进行顺序比较,找到合适的位置之后就将V[i]插入,而插入点之后的元素都向后移动一位。

#include<iostream>
#include<stdlib.h>
using namespace std;
int* InsertSort(int* A, int n)
{
	int InsertNum;
	for (int i = 1; i < n; i++)
	{
		InsertNum = A[i];
		int j = i;
		while(j>0 && InsertNum < A[j-1])
		{
				A[j] = A[j - 1];
				j--;
		}
		A[j] = InsertNum;
	}
	return A;
}
int main()
{
	int n;
	while (cin >> n)
	{
		int * arr = new int[n];
		for (int i = 0; i < n; i++)
			arr[i] = rand()%100;
		InsertSort(arr, n);
		for (int i = 0; i < n; i++)
			cout << arr[i] << " ";
		cout << endl;
	}
	system("pause");
	return 0;
}
②二分插入排序:

二分插入排序又叫折半插入排序,它同直接插入排序一样是每次将一个数据对象插入已经排好序的顺序表中。数据对象在顺序表中存储,当插入第i个对象V[i]时,前面的i-1个元素V[0]、V[1]、...... 、V[i-1]已经有序。第i个元素的关键码用折半查找的方法在已经存在的i-1个元素的关键码中找到合适的位置之后,将V[i]插入。(优化了查找)

#include<iostream>
#include<stdlib.h>
using namespace std;
int * BinaryInsertSort(int* A, int n)
{
	int mid;
	for (int i = 1; i < n; i++)
	{
		int InsertNum = A[i];
		int left = 0;
		int right = i - 1;
		while (left <= right)
		{
			mid = (left + right) / 2;
			if (InsertNum > A[mid])
				left = mid + 1;
			else
				right = mid - 1;
		}
		for (int j = i; j > left; j--)
			A[j] = A[j - 1];
		A[left] = InsertNum;
	}
	return A;
}
int main()
{
	int n;
	while (cin >> n)
	{
		int * arr = new int[n];
		for (int i = 0; i < n; i++)
			arr[i] = rand()%100;
		BinaryInsertSort(arr, n);
		for (int i = 0; i < n; i++)
			cout << arr[i] << " ";
		cout << endl;
	}
	system("pause");
	return 0;
}

③希尔排序:

该算法先取一个小于数据表中元素个数n的整数gap,并以此为第一个间隔,将数据表分为gap个子序列,所有距离为gap的对象放在同一个系序列中。也就是把数据表中的全部元素分成了gap个组。而所有距离为gap的整数倍的记录会被放在同一个组中。分组确定后,就在每一个小组中分别进行直接插入排序。局部排序完成后,就缩小间隔gap,并重复上述步骤,直至取到gap=1时,就完成最后的一次直接插入。

#include<iostream>
#include<stdlib.h>
using namespace std;
int* ShellSort(int* A, int n)
{
	int InsertNum;
	int gap = n / 2;
	while (gap)
	{
		for (int i = gap; i < n; i++)
		{
			InsertNum = A[i];
			int j = i;
			while (j >= gap && InsertNum < A[j - gap])
			{
				A[j] = A[j - gap];
				j -= gap;
			}
			A[j] = InsertNum;
		}
		gap /= 2;
	}
	return A;
}
int main()
{
	int n;
	while (cin >> n)
	{
		int * arr = new int[n];
		for (int i = 0; i < n; i++)
			arr[i] = rand()%100;
		ShellSort(arr, n);
		for (int i = 0; i < n; i++)
			cout << arr[i] << " ";
		cout << endl;
	}
	system("pause");
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值