选择排序
选择排序一般指待排序的数中挑选最值,放数组末位,减小数组长度,再挑选待排序数中的最值。
选择排序一般有:简单选择排序,堆排序
简单选择排序
也称为直接选择排序,在待排序数组中找到最值下标与已排序数组的新下标交换元素值。
简单选择排序-代码
void SelectSort(int A[], int n)
{
for (int i = n - 1; i >= 0; i--)
{
int max = i;
for (int j = i - 1; j >= 0; j--)
if (A[max] < A[j])
max = j;
if (max != i)
swap(A[max], A[i]);
}
}
int main()
{
int A[] = {8, 7, 5, 6, 1, 3, 2, 9, 10, 234, 121, 4, 2324, 98};
SelectSort(A, 14);
for (int i = 0; i < 14; i++)
cout << A[i] << " ";
return 0;
}
堆排序-思路
使用数组存储堆,使用筛选法建立堆。
- 堆的定义
堆一般有两种,小顶堆和大顶堆,堆顶元素是组成堆所有元素中的最值,小顶堆堆顶元素是所有数中的最小值,以数组存储堆,一般A[0]表示堆顶元素。大顶堆堆顶元素是所有元素的最大值。 - 从小到大排序
建立大顶堆,不断交换堆顶元素与数组末位元素,重新调整为数组长度-1的大顶堆。大的都到了数组后面,所以结束排序后输出数组是从小到大排序。 - 从大到小排序
建立小顶堆,不断交换堆顶元素与数组末位元素,重新调整为数组长度-1的小顶堆,小的都到了数组后面,所以结束排序后输出数组是从大到小排序。
堆排序-代码
修改代码24行和27行可以变为从大到小排序
void Display(int A[], int n)
{
for (int i = 0; i < n; i++)
{
if (i != 0)
cout << " ";
cout << A[i];
}
cout << endl;
}
void AdjustDown(int A[], int root, int n)
{
int left = root * 2 + 1;
int temp = A[root];
while (left < n)
{
// left值变为子树的最大值
if (left + 1 < n && A[left] < A[left + 1])
left++;
if (temp < A[left])
{
A[root] = A[left];
root = left;
left = root * 2 + 1;
}
else
break;
}
A[root] = temp;
}
// root为最后一个非叶子结点
void GenerateHeap(int A[], int root, int n)
{
if (root >= 0)
{
AdjustDown(A, root, n);
GenerateHeap(A, root - 1, n);
}
}
// n为A数组长度
void HeapSort(int A[], int n)
{
// 建立堆
GenerateHeap(A, n / 2 - 1, n);
// 交换堆顶元素与末位元素
for (int i = n - 1; i > 0; i--)
{
swap(A[i], A[0]);
AdjustDown(A, 0, i);
}
}
int main()
{
int A[] = {7, 6, 8, 4, 5, 9, 1, 2, 10, 23, 15, 3, 65};
HeapSort(A, 13);
Display(A, 13);
return 0;
}