学习《算法》的心得总结,一些观点通过阅读书目自行总结,如有雷同,纯属巧合。另一些观点摘自《算法》一书。
一、选择排序
选择排序的思想(按照从小到大的顺序排列):
1、找到数组中的最小值,将它与数组中的第一个元素进行位置交换。
2、再找到数组中次小值,将它与数组中的第二个元素进行位置交换。
3、以此类推,直至数组按照从小到大的顺序排列完成后为止。
算法编写:
#include
#include
using namespace std;
vector
int main()
{
int SIZE;
cout << "输入数组大小: ";
cin >> SIZE;
int *arr = new int[SIZE];
vector
for (int i = 0; i < SIZE; i++)
{
cin >> arr[i];
}
cout << "数组为:";
for (int j = 0; j < SIZE; j++)
{
cout << arr[j] << " ";
}
cout << endl;
Result = SORT(arr,SIZE);
cout << "排序后数组为:";
for (int j = 0; j < SIZE; j++)
{
cout << Result[j] << " ";
}
delete[] arr;
system("pause");
return 0;
}
vector
{
int Min;
int index;
int temp;
vector
for (int i = 0; i < Size; i++)
{
Min = arr[i];
index = i;
for (int j = i; j < Size; j++)
{
if (Min > arr[j])
{
Min = arr[j];
index = j;
}
else
{
continue;
}
}
temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
for (int i = 0; i < Size; i++)
{
result[i] = arr[i];
}
return result;
}
存在问题:倘若排序的函数只能够用数组作为参数,而不输入数组的长度值。该如何通过函数值获取到数组的长度。
解决办法:使用C++带有的模板类!(解决办法以后在尝试)
选择排序算法复杂度:
需要进行 (N-1)+(N-2)+...+1 = N(N-1)/2次比较,如果N比较大,那么可以近似约等于进行N^2/2次比较。并且选择排序需要进行N次交换。
二、插值排序
插值排序的思想(按照从小到大进行排列):
基本思想就是比较数组中每两个元素的大小,若元素1(位置在前)比元素2(位置在后)大,则将元素2插入到元素1之前。通过插值排序算法,当前处于判断的元素之前的元素为已经排列好的序列,而当前元素之后的元素处于乱序的序列。
算法编写(主函数沿用选择排序的主函数):
vector
{
int temp;
vector
for (int i = 0; i < Size; i++)
{
for (int j = i; j > 0; j--)
{
if (arr[j] < arr[j - 1])
{
temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
else
{
continue;
}
}
}
for (int i = 0; i < Size; i++)
{
result[i] = arr[i];
}
return result;
}
插入排序算法复杂度:
平均情况:需要 N^2 / 4次比较以及 N^2 / 4次交换。
最坏的情况:需要 N^2 / 2 次比较以及 N^2 / 2次交换。
最好的情况:需要N-1次比较以及0次交换。
插入排序算法适用范围:
适合于一些部分有序数组。几种经典的部分有序数组有:
1、数组中的元素距离它最终要处于的位置不远。
2、一个有序的大数组与一个小数组拼接。
3、数组中只有某几个元素的位置不正确。
三、希尔排序
希尔排序的思想(按照从小到大进行排列):
使数组中任意间隔为h的元素都是有序的,称为h有序数组。其方法与插入排序的方法一致,只是比较大小的两个数不是相邻的两个数,而是间隔为h的两个数。
算法编写(沿用上主函数):
vector
{
int temp;
int h = 1;
vector
while (h < Size / 3)
{
h = 3 * h + 1;
}
while (h >= 1)
{
for (int i = h; i < Size; i++)
{
for (int j = i; j >= h; j -= h)
{
if (arr[j] < arr[j - h])
{
temp = arr[j];
arr[j] = arr[j - h];
arr[j - h] = temp;
}
else
{
continue;
}
}
}
h = h / 3;
}
for (int i = 0; i < Size; i++)
{
result[i] = arr[i];
}
return result;
}
希尔排序最重要的是找到其h值,其h值与数组长度相关,采用(3*h+1)1,4,13,40,121...的h值能够比较好的找到基于数组长度的最大h有序数组,降低插入排序(h=1)的复杂度。
除了这三种经典算法之外,还有一些排序算法没有介绍,以后进行更深入的学习后,再进行补充。
——俊仔