C++编写算法(一)——排序问题

学习《算法》的心得总结,一些观点通过阅读书目自行总结,如有雷同,纯属巧合。另一些观点摘自《算法》一书。

一、选择排序

选择排序的思想(按照从小到大的顺序排列):

1、找到数组中的最小值,将它与数组中的第一个元素进行位置交换。

2、再找到数组中次小值,将它与数组中的第二个元素进行位置交换。

3、以此类推,直至数组按照从小到大的顺序排列完成后为止。

算法编写:

#include

#include

using namespace std;

vector SORT(int arr[],int Size);

int main()

{

int SIZE;

cout << "输入数组大小: ";

cin >> SIZE;

int *arr = new int[SIZE];

vector Result(SIZE);

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 SORT(int arr[],int Size)

{

int Min;

int index;

int temp;

vector result(Size);

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 SORT(int arr[],int Size)

{

int temp;

vector result(Size);

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 SORT(int arr[],int Size)

{

int temp;

int h = 1;

vector result(Size);

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)的复杂度。


除了这三种经典算法之外,还有一些排序算法没有介绍,以后进行更深入的学习后,再进行补充。

——俊仔

你可能感兴趣的:(C++编写算法(一)——排序问题)