数据结构:选择排序(简单选择排序、堆排序)

1.简单选择排序:指一种排序算法,在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。

方法是设所排序序列的记录个数为n。i取1,2,…,n-1,从所有n-i+1个记录(Ri,Ri+1,…,Rn)中找出排序码最小的记录,与第i个记录交换。执行n-1趟 后就完成了记录序列的排序。

2.堆排序:是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点

已知长度len,则最后一个非叶子节点的位置:len2-1

已知父节点i,则左子树位置:2i+1

                       则右子树位置:2i+2

附:各种排序时空复杂度对比

简单选择排序实现:

#include<stdio.h>
#include<stdlib.h>

void SimpleSelectSort(int arr[], int len)
{
	int i = 0;
	int j = i + 1;
	int min = i;
	for (i; i < len - 1; ++i)
	{
		min = i;
		for (j = i + 1; j < len; ++j)
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		if (min != i)
		{
			int tmp = arr[min];
			arr[min] = arr[i];
			arr[i] = tmp;
		}
	}
}
void Show(int arr[], int len)
{
	for (int i = 0; i < len; ++i)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

堆排序实现:

#include<stdio.h>
#include<stdlib.h>

void HeapAdjust(int arr[], int pos, int len)
{
	int i = pos;
	int j = 2 * i + 1;
	int tmp = 0;
	for (j; j < len; j = 2 * i + 1)
	{
		if (j < len - 1 && arr[j + 1] > arr[j])++j;
		if (arr[i] >= arr[j])break;
		tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
		i = j;
	}
}
void HeapSort(int arr[], int len)
{
	int tmp = 0;
	for (int i = len / 2 - 1; i >= 0; --i)
	{
		HeapAdjust(arr, i, len);
	}
	for (int i = len - 1; i > 0; --i)
	{
		tmp = arr[0];
		arr[0] = arr[i];
		arr[i] = tmp;
		HeapAdjust(arr, 0, i);
	}
}

猜你喜欢

转载自blog.csdn.net/wh_0727/article/details/83795047
今日推荐