数据结构与算法之排序
来源:互联网 发布:重启mysql服务 编辑:程序博客网 时间:2024/05/29 11:35
简单的排序算法有冒泡排序、选择排序和插入排序,今天在这里总计一下各种排序算法的知识,方便以后再看的时候用到。
冒泡排序执行的算法如下:
假如现在有一个队伍,人数为N,需要按从低到高的顺序从左到右排序:
从队列的最左边开始,比较0号位置的队员和1号位置的队员。如果左边的队员比右边的高,就让两个队员交换,如果右边
的队员高就什么也不做,然后右移一个位置,比较1号位置和2号位置的队员,然后如果左边高就就把连个队员交换位置,
一直到N-1,这样执行完一次虽然没有没有排好序,但是已经把最高的排在了队伍的最右边,然后进行下一次排列知道N-2,
一直排到1就把这个队列按顺序排列了。下面是用JAVA写的代码:
public void bubbleSort(){
int out in;
for(out=nElem-1;out>1;out--){
for(in=0;in<out;in++){
if(a[in]>a[in+1]){
swap(in,in+1);
}
}
冒泡排序执行的算法如下:
假如现在有一个队伍,人数为N,需要按从低到高的顺序从左到右排序:
从队列的最左边开始,比较0号位置的队员和1号位置的队员。如果左边的队员比右边的高,就让两个队员交换,如果右边
的队员高就什么也不做,然后右移一个位置,比较1号位置和2号位置的队员,然后如果左边高就就把连个队员交换位置,
一直到N-1,这样执行完一次虽然没有没有排好序,但是已经把最高的排在了队伍的最右边,然后进行下一次排列知道N-2,
一直排到1就把这个队列按顺序排列了。下面是用JAVA写的代码:
public void bubbleSort(){
int out in;
for(out=nElem-1;out>1;out--){
for(in=0;in<out;in++){
if(a[in]>a[in+1]){
swap(in,in+1);
}
}
}
}
swap 的代码是:
private void swap(int one,int two){
long temp=a[one];
a[one]=a[two];
a[two]=temp;
}
算法的效率:一般来说如果数组中有N个数据项,第一次排序进行N-1次比较,第二次进行N-2次比较,如此类推,
所以一共进行比较的次数是:N-1+N-2+N-3+……+N-3=N*(N-1)/2;忽略1就是N^2/2
如果数据是随机的那么将有一半的数据进行交换,那么交换的次数为N^2/4,这个算法的运行时间及时间复杂度为O(N^2)
选择排序:
选择排序的算法将交换次数从O(N^2)变成了变成了O(N),但是比较次数仍旧为:N^2/2
该算法的主要思想是:首先从第一个开始遍历了整个队伍,找出队伍中最矮的那个人,然后把他放到队伍的第一个位置,
把第一个位置的放到空出来的那个位置,然后从第二个开始再进行上一个步骤,直到把队伍中所有的队员都排序就可以了。
算法的代码:
public void selectSort(){
int out,in,min;
for(out=0;out<nElem-1;out++){
min=out;
for(in=out+1;in<nElems;in++){
if(a[in]<a[min]){//找到一个更小的值就进行交换
min=in;
}
swap(out,min);
}
}
}
从上面的两个算法中可以看出,之所以选择排序中数据交换的次数变成了O(N),那是因为交换的那个代码放在了第一个循环里,
并没有放在第二个循环里,所以交换的次数就降低了一个数量级。所以这两种算法进行比较的话,肯定是选择排序更快,当N值
较小时,特别是如果交换的时间级比比较的时间大得多时,选择排序实际上是相当快的。
另外一种算法是插入排序:
插入排序在这三个算法中是最好的一种,虽然插入排序算法仍然需要O(N^2)的时间,但是在一般情况下,它要比冒泡排序快一倍,
比选择排序还要快一点。该算法的主要思想是:假设某个位置的人前面的人都已经是排好位置的,这个位置就是被标记的位置,然
后把处于标记位置的元素放到临时变量里,然后从标记位置的前一个位置开始和那个临时变量进行比较,如果比它大的话就向右进
行移动,直到移动到不小于临时变量的位置,就把这个临时变量插到这个位置,然后把那个标记位置向前移动一个位置。直到把所
有的变量全部排序。
下面是代码:
public void insertionSort(){
int in,out;
for(out=1;out<nElems;out++){
long temp=a[out];//复制这个临时变量
in=out;
while(in>0&&a[in-1]>=temp){
a[in]=a[in-1];
--in;
}
a[in]=temp;
}
}
}
swap 的代码是:
private void swap(int one,int two){
long temp=a[one];
a[one]=a[two];
a[two]=temp;
}
算法的效率:一般来说如果数组中有N个数据项,第一次排序进行N-1次比较,第二次进行N-2次比较,如此类推,
所以一共进行比较的次数是:N-1+N-2+N-3+……+N-3=N*(N-1)/2;忽略1就是N^2/2
如果数据是随机的那么将有一半的数据进行交换,那么交换的次数为N^2/4,这个算法的运行时间及时间复杂度为O(N^2)
选择排序:
选择排序的算法将交换次数从O(N^2)变成了变成了O(N),但是比较次数仍旧为:N^2/2
该算法的主要思想是:首先从第一个开始遍历了整个队伍,找出队伍中最矮的那个人,然后把他放到队伍的第一个位置,
把第一个位置的放到空出来的那个位置,然后从第二个开始再进行上一个步骤,直到把队伍中所有的队员都排序就可以了。
算法的代码:
public void selectSort(){
int out,in,min;
for(out=0;out<nElem-1;out++){
min=out;
for(in=out+1;in<nElems;in++){
if(a[in]<a[min]){//找到一个更小的值就进行交换
min=in;
}
swap(out,min);
}
}
}
从上面的两个算法中可以看出,之所以选择排序中数据交换的次数变成了O(N),那是因为交换的那个代码放在了第一个循环里,
并没有放在第二个循环里,所以交换的次数就降低了一个数量级。所以这两种算法进行比较的话,肯定是选择排序更快,当N值
较小时,特别是如果交换的时间级比比较的时间大得多时,选择排序实际上是相当快的。
另外一种算法是插入排序:
插入排序在这三个算法中是最好的一种,虽然插入排序算法仍然需要O(N^2)的时间,但是在一般情况下,它要比冒泡排序快一倍,
比选择排序还要快一点。该算法的主要思想是:假设某个位置的人前面的人都已经是排好位置的,这个位置就是被标记的位置,然
后把处于标记位置的元素放到临时变量里,然后从标记位置的前一个位置开始和那个临时变量进行比较,如果比它大的话就向右进
行移动,直到移动到不小于临时变量的位置,就把这个临时变量插到这个位置,然后把那个标记位置向前移动一个位置。直到把所
有的变量全部排序。
下面是代码:
public void insertionSort(){
int in,out;
for(out=1;out<nElems;out++){
long temp=a[out];//复制这个临时变量
in=out;
while(in>0&&a[in-1]>=temp){
a[in]=a[in-1];
--in;
}
a[in]=temp;
}
}
0 0
- 算法与数据结构之排序
- 数据结构与算法之排序
- 数据结构与算法之排序
- 数据结构与算法之排序
- 数据结构与算法之排序
- 数据结构与算法之排序
- 【数据结构与算法之排序】归并排序
- 常用数据结构与算法之排序算法
- 数据结构与算法练习题之高效排序
- 数据结构与算法之快速排序
- 数据结构与算法之二分法插入排序
- 数据结构与算法之插入排序
- 算法与数据结构之堆排序
- 数据结构与算法之归并排序
- 数据结构与算法之二冒泡排序
- 数据结构与算法之六堆排序
- 数据结构与算法之七归并排序
- Java数据结构与算法之排序
- B. Unary
- 无题。
- 微信小程序带参传递的界面跳转的两种方式
- Think PHP 学习笔记 6-7.CURD演示
- 1022. D进制的A+B (20)
- 数据结构与算法之排序
- 洛谷 P1020 导弹拦截
- ViewFlipper
- hdu 2553 n皇后的简单写法
- 人工智能时代的降临_0
- 数据结构与算法之栈和队列
- 除了杨洋吴亦凡,搜狐新闻靠什么俘获了“小鲜肉”?
- sduacm16级寒假训练 动态规划(一)
- Partitioning by Palindromes