博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
屌丝的常用排序-----three
阅读量:6335 次
发布时间:2019-06-22

本文共 1725 字,大约阅读时间需要 5 分钟。

wKioL1cBsTWAB2j-AAEeGkSMR7w198.jpg

    上面文章讲完了,本次我们来讨论选择排序。

      

          选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。


1、普通(单个)选择排序

    每遍历一次,记录下最值元素所在位置,遍历结束后,将此最值元素调整到合适的位置。这样一次遍历,只需一次交换,便可将最值放置到合适位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//成功返回0,失败返回-1
int 
select_sort(
int 
*arr,
const 
int 
n)
{
    
//判断参数是否正确
    
if
(NULL == arr || 0 >= n)
            
return 
-1;
             
     
int 
i = 0;    
//循环使用
     
int 
j = 0;    
//循环使用
     
int 
k = -1;    
//记录比较的下标
     
int 
temp;        
//交换时作中间值
      
      
//每次循环只进行一次交换 最多进行n - 1次循环,因此总体上,比冒泡进行交换的次数少
     
for
(i = 0; i < n - 1; i++)
     
{
            
//第i次排序时,已经进行了i次大循环,因此已经排好了i个元素  
            
//已排好序的元素0,,...,i-2,i-1  
            
//待排元素为i,i+1,...,n-1  
             
            
k = i;    
//拿i的位置值与后面的值相比较
            
for
(j = i + 1; j < n; i++)
            
{
                    
if
(arr[k] < arr[j])
                        
k = j;
            
}
             
            
//判断k值是否有变化,有变量就交换
            
if
(k != i)
            
{
                
temp = arr[k];
                
arr[k] = arr[i];
                
arr[i] = temp;
            
}
     
}
     
return 
0;
}

2、二分选择排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
int 
select_sort(
int 
*arr, 
const 
int 
n)
{
    
//判断参数是否正确
    
if
(NULL == arr || 0 >= n)
        
return 
-1;
         
    
int 
i = 0;
    
int 
j = 0;
    
int 
minpos = -1;
    
int 
maxpos = -1;
    
int 
temp;
    
//每次循环完进行二次交换 最多进行n/2次循环,因此总体上,比冒普通选择排序的次数少
    
for
(i = 0; i < n / 2; i++)
    
{
        
minpos = i;
        
maxpos = i;
        
for
(j = i + 1; j < n; j++)
        
{
            
if
(arr[j] > arr[maxpos])
            
{
                
maxpos = j;
                
continue
;
            
}      
             
            
if
(arr[j] < arr[minpos])
            
{
                
minpos = j;
            
}
        
}
        
temp = arr[i];
        
arr[i] = arr[minpos];
        
arr[minpos] = temp;
         
        
if
(maxpos == i)
        
{
            
temp = arr[minpos];
            
arr[minpos] = arr[n - 1 - i];
            
arr[n - 1 - i] = temp;
        
}
        
else
        
{
            
temp = arr[maxpos];
            
arr[maxpos] = arr[n - 1 - i];
            
arr[n - 1 -i] = temp;
        
}
    
}
    
return 
0;
}
      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1763976,如需转载请自行联系原作者
你可能感兴趣的文章
WebRTC clientICE 延迟问题
查看>>
Sql Server 强制断开数据库已有连接的方法
查看>>
Electron安装
查看>>
re正则表达式13_review of regex symbols
查看>>
使用T-SQL找出执行时间过长的作业
查看>>
Kali2.0 Sqlmap清除历史扫描日志
查看>>
Access restriction: The type 'RSACipher' is not API
查看>>
给js创建的一个input数组绑定click事件
查看>>
APT攻击
查看>>
纯真数据库解析
查看>>
【Unity】13.2 通过Lighting Window设置相关参数
查看>>
Eclipse附加项目中的某个jar包的源码
查看>>
spring源码分析之spring-core asm概述
查看>>
CentOS6.3搭建Nginx代理访问MongoDB GridFS图片资源
查看>>
数字图像处理-----直方图均衡化
查看>>
关于context你必须知道的一切
查看>>
Oracle 10g RAC 启动与关闭
查看>>
类似nike+、香蕉打卡的转场动画效果-b
查看>>
Sql之left join、right join、inner join的区别(转)
查看>>
Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析
查看>>