排序小结(一)

冒泡排序法(时间复杂度:O(N²)
//使用flag的冒泡排序法
int bubbleSort(int A[], int N)
{
	int sw = 0;//记录交换的次数
	bool flag = 1;//假如某一次循环过程中没有交换相邻元素,则不必再排下去了
	for (int i = 0; flag; i++)//表示未排序部分的开头元素
	{
		flag = 0;
		for (int j = N - 1; j >= i + 1; j--)//用于对未排序部分中的相邻元素两两比较
		{
			if (A[j] < A[j - 1])
			{
				swap(A[j], A[j - 1]);
				flag = 1;
				sw++;
			}
		}
	}
	return sw;
}

插入排序法(能快速处理相对有序的数据,降序情况下时间复杂度O(N²),升序情况下则为O(N)
//插入排序(0起点数组)
void insertionSort(int A[], int N)
{
	int j, i, v;
	//i表示未排序部分的开头元素
	//v临时保存A[i]的值
	//j用于在已排序部分寻找v的插入位置
	for (i = 1; i < N; i++)
	{
		v = A[i];
		j = i - 1;
		while (j >= 0 && A[j] > v)
		{
			A[j + 1] = A[j];
			j--;
		}
		A[j + 1] = v;
	}
}

选择排序法(不稳定排序,可能会交换相同值的位置,时间复杂度O(N²))
//选择排序法(0起点)
int selectionSort(int A[], int N)
{
	int i, j, t, sw = 0, minj;
	for (i = 0; i < N - 1; i++)
	{
		minj = i;
		for (j = i; j < N; j++)
		{
			if (A[j] < A[minj])
				minj = j;
		}
		t = A[i]; A[i] = A[minj]; A[minj] = t;
		if (i != minj) sw++;
	}
	return sw;
}
希尔排序(重复进行一间隔为g的元素为对象的插入排序,当时间复杂度基本维持在
vector<int> G;

//指定了间隔g的插入排序
void insertionSort(int A[], int n, int g)
{
	for (int i = g; i < n; i++)
	{
		int v = A[i];
		int j = i - g;
		while (j >= 0 && A[j] > v)
		{
			A[j + g] = A[j];
			j -= g;
		}
		A[j + g] = v;
	}
}

void shelllSort(int A[], int n)
{
	//生成数列G={1,4,13,40,121,364,1093...}
	for (int h = 1; ;)
	{
		if (h > n)	break;
		G.push_back(h);
		h = 3 * h + 1;
	}
	for (int i = G.size() - 1; i >= 0; i--)
	{
		insertionSort(A, n, G[i]);
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值