论文部分内容阅读
摘要:排序,字面意思就是排列顺序,例如给一串数字,按照从小到大,或者从大到小的顺序进行排列。当然排列的过程需要用算法程序严格表述出来,排序算法种类很多,需要根据具体的衡量标准来进行考量,例如时间复杂度,空间复杂度,稳定性,等等,当然在某种程度上,一般提降低空间复杂度就回提升时间复杂度,所以我们在具体应用算法时,应根据具体的应用场景选择更合适的算法。
关键词: 排序;排序算法
1 排序算法的分类
排序(Sorting) 算法是我们科学研究过程中的一个常规算法,作用是将一个数据元素(或记录)的随意排列,然后重新排列成一个大小有序的序列。
1 稳定度(稳定性)
稳定性是一个特别重要的评估标准,稳定的算法在排序的过程中不会改变元素彼此的位置的相对次序,反之不稳定的排序算法经常会改变这个次序,这是我们不愿意看到的,我们在使用排序算法或者选择排序算法时,更希望这个次序不会改变,更加稳定,所以排序算法的稳定性,是一个特别重要的参数衡量指标依据。
就如同空间复杂度和时间复杂度一样。有时候甚至比时间复杂度,空间复杂度更重要一些。
所以往往评价一个排序算法的好坏往往可以从下边几个方面入手:
(1)时间复杂度:即从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。
(2)空间复杂度:就是从序列的初始状态经过排序移位变换的过程一直到最终的状态所花费的空间开销。
(3)使用场景:排序算法有很多,不同种类的排序算法适合不同种类的情景,可能有时候需要节省空间对时间要求没那么多,反之,有时候则是希望多考虑一些时间,对空间要求没那么高,总之一般都会必须从某一方面做出抉择。
(4)稳定性:稳定性是不管考虑时间和空间必须要考虑的问题,往往也是非常重要的影响选择的因素。
2 几种种算法的基本思想及其分析
2.1直接插入排序
2.1.1算法思想
例如:给定n=8,数组R中的8个元素的排序码为(8,3,2,1,7,4,6,5),则直接选择排序的过程如下所示
由于百科不方便画出关联箭头 所以用 n -- n 表示 :
初始状态 [ 8 3 2 1 7 4 6 5 ] 8 -- 1
第一次 [ 1 3 2 8 7 4 6 5 ] 3 -- 2
第二次 [ 1 2 3 8 7 4 6 5 ] 3 -- 3
第三次 [ 1 2 3 8 7 4 6 5 ] 8 -- 4
第四次 [ 1 2 3 4 7 8 6 5 ] 7 -- 5
第五次 [ 1 2 3 4 5 8 6 7 ] 8 -- 6
第六次 [ 1 2 3 4 5 6 8 7 ] 8 -- 7
第七次 [ 1 2 3 4 5 6 7 8 ] 排序完成
2.1.2时间复杂度
从时间复杂度的角度考虑,当然了,如果所给我们的序列如果已经是要求的序列状态了,这种情况下是最理想的情况,时间包括空间复杂度最低,或者起码是有顺序的,那么时间复杂度也仅仅是O(n)而已。反之如果初始状态完全与理想状态的顺序相反那么,复杂度最高,为O(n?)。
2.1.3空间复杂度
空间复杂度为O(1).
2.1.4代码实现
void charupaixu(elemtype R[], int n) {
int i, k, m;
elemtype t;
for (k = 0; ik< n - 1; k++) {
m = k;
for (j = k + 1; j < n; j++)
if (R[j] < R[m]) m = j;
if (m != k) {
t = R[k];
R[k] = R[m];
R[m] = t;
}
}
}
2.2希尔排序
2.2.1算法思想
首先取一个变量小于n的数字,m 2.2.2时间复杂度
参考资料显示为O(n^1.3)
2.2.3空间复杂度
O(1)。
2.2.4代码实现
ar arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04];
var leng= arr.length;
for (var fr = Math.floor(len / 2); fr > 0; fraction = Math.floor(fr / 2)) {
for (var i = fr; i < leng; i++) {
for (var j = i - fr; j >= 0 && arr[j] > arr[fr + j]; j -= fr) {
var temp = arr[j];
arr[j] = arr[fr + j];
arr[fr + j] = temp;
}
}
}
console.log(arr);
2.3選择排序
2.3.1算法思想
顾名思义选择排序就是首先通过对初始状态的序列状态,用第二个元素跟第一个元素比较,如果第一个应该放最大的元素,依次用第二个跟第一个比较如果第二个比它大,则记住第二个数字的位置L,再用第二个数字跟第三个数字比较,找到最大的记住每次最大的L值,一直到遍历完左右的,这样一边下去就确定了哪个最大,需要跟第一个数字交换的话,用L为数字换第一个就行了,不需要交换就继续这样的求出第二个数字直到结束。
2.3.2时间复杂度
同样选择排序的算法时间复杂度也要跟它的初始状态有关系,O(n2)。
2.3.3空间复杂度
O(1)。
2.3.4代码实现
class xeuanzepaixu {
public:
T data;
int id;
int at;
TreeNode & operator=(TreeNode & treenode)
{
this->data=treenode.data;
this->id=treenode.id;
this->at=treenode.at;
return *this;
}
};
3 结语
本文分别介绍几种常用的排序算法,其中包括,希尔排序,选择排序等,并且每种排序算法分别从算法思想,算法时间复杂度,算法空间复杂度和应用场景来进行性能分析,并且给出了代码实现。在实际应用中应该根据具体问题来选择适合的排序算法。
关键词: 排序;排序算法
1 排序算法的分类
排序(Sorting) 算法是我们科学研究过程中的一个常规算法,作用是将一个数据元素(或记录)的随意排列,然后重新排列成一个大小有序的序列。
1 稳定度(稳定性)
稳定性是一个特别重要的评估标准,稳定的算法在排序的过程中不会改变元素彼此的位置的相对次序,反之不稳定的排序算法经常会改变这个次序,这是我们不愿意看到的,我们在使用排序算法或者选择排序算法时,更希望这个次序不会改变,更加稳定,所以排序算法的稳定性,是一个特别重要的参数衡量指标依据。
就如同空间复杂度和时间复杂度一样。有时候甚至比时间复杂度,空间复杂度更重要一些。
所以往往评价一个排序算法的好坏往往可以从下边几个方面入手:
(1)时间复杂度:即从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。
(2)空间复杂度:就是从序列的初始状态经过排序移位变换的过程一直到最终的状态所花费的空间开销。
(3)使用场景:排序算法有很多,不同种类的排序算法适合不同种类的情景,可能有时候需要节省空间对时间要求没那么多,反之,有时候则是希望多考虑一些时间,对空间要求没那么高,总之一般都会必须从某一方面做出抉择。
(4)稳定性:稳定性是不管考虑时间和空间必须要考虑的问题,往往也是非常重要的影响选择的因素。
2 几种种算法的基本思想及其分析
2.1直接插入排序
2.1.1算法思想
例如:给定n=8,数组R中的8个元素的排序码为(8,3,2,1,7,4,6,5),则直接选择排序的过程如下所示
由于百科不方便画出关联箭头 所以用 n -- n 表示 :
初始状态 [ 8 3 2 1 7 4 6 5 ] 8 -- 1
第一次 [ 1 3 2 8 7 4 6 5 ] 3 -- 2
第二次 [ 1 2 3 8 7 4 6 5 ] 3 -- 3
第三次 [ 1 2 3 8 7 4 6 5 ] 8 -- 4
第四次 [ 1 2 3 4 7 8 6 5 ] 7 -- 5
第五次 [ 1 2 3 4 5 8 6 7 ] 8 -- 6
第六次 [ 1 2 3 4 5 6 8 7 ] 8 -- 7
第七次 [ 1 2 3 4 5 6 7 8 ] 排序完成
2.1.2时间复杂度
从时间复杂度的角度考虑,当然了,如果所给我们的序列如果已经是要求的序列状态了,这种情况下是最理想的情况,时间包括空间复杂度最低,或者起码是有顺序的,那么时间复杂度也仅仅是O(n)而已。反之如果初始状态完全与理想状态的顺序相反那么,复杂度最高,为O(n?)。
2.1.3空间复杂度
空间复杂度为O(1).
2.1.4代码实现
void charupaixu(elemtype R[], int n) {
int i, k, m;
elemtype t;
for (k = 0; ik< n - 1; k++) {
m = k;
for (j = k + 1; j < n; j++)
if (R[j] < R[m]) m = j;
if (m != k) {
t = R[k];
R[k] = R[m];
R[m] = t;
}
}
}
2.2希尔排序
2.2.1算法思想
首先取一个变量小于n的数字,m
参考资料显示为O(n^1.3)
2.2.3空间复杂度
O(1)。
2.2.4代码实现
ar arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04];
var leng= arr.length;
for (var fr = Math.floor(len / 2); fr > 0; fraction = Math.floor(fr / 2)) {
for (var i = fr; i < leng; i++) {
for (var j = i - fr; j >= 0 && arr[j] > arr[fr + j]; j -= fr) {
var temp = arr[j];
arr[j] = arr[fr + j];
arr[fr + j] = temp;
}
}
}
console.log(arr);
2.3選择排序
2.3.1算法思想
顾名思义选择排序就是首先通过对初始状态的序列状态,用第二个元素跟第一个元素比较,如果第一个应该放最大的元素,依次用第二个跟第一个比较如果第二个比它大,则记住第二个数字的位置L,再用第二个数字跟第三个数字比较,找到最大的记住每次最大的L值,一直到遍历完左右的,这样一边下去就确定了哪个最大,需要跟第一个数字交换的话,用L为数字换第一个就行了,不需要交换就继续这样的求出第二个数字直到结束。
2.3.2时间复杂度
同样选择排序的算法时间复杂度也要跟它的初始状态有关系,O(n2)。
2.3.3空间复杂度
O(1)。
2.3.4代码实现
class xeuanzepaixu {
public:
T data;
int id;
int at;
TreeNode & operator=(TreeNode & treenode)
{
this->data=treenode.data;
this->id=treenode.id;
this->at=treenode.at;
return *this;
}
};
3 结语
本文分别介绍几种常用的排序算法,其中包括,希尔排序,选择排序等,并且每种排序算法分别从算法思想,算法时间复杂度,算法空间复杂度和应用场景来进行性能分析,并且给出了代码实现。在实际应用中应该根据具体问题来选择适合的排序算法。