• 经典排序之 选择排序


    现在简单来讲一下选择排序的思想:

    我们接触选择排序的时间很长了,也是我们编程时需要最先接触的程序。他的思想确实较简单。

    算法思想:

      选择排序需要针对数组从头到尾进行扫描,其实就是记录下扫描一遍后整个数组的最小元素和最小元素的位置,然后和第一个元素进行交换,这样经过一遍排序我们就可以确定一个元素的最终位置;然后从第二个数据开始再次循环扫描交换,直到最后;在这里交换时有一个优化的过程,如果最小元素的位置和之前记录的位置一样,则可以通过比较,避免无谓的交换,节省时间和空间

    选择排序是一个不稳定的排序,最好最坏和平均下来的时间复杂度都是O(n2);

    算法实现:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 void swap(int &a, int &b){
     5     int temp = a;
     6     a = b;
     7     b = temp;
     8 } 
     9 
    10 void selectSort(int *data, int length){
    11     
    12     if(data == NULL || length < 0){
    13         return;
    14     }
    15     
    16     for(int i = 0; i < length - 1; i++){
    17         int value = data[i];
    18         int index = i;                              
    19         
    20         for(int j = i + 1; j < length; j++){
    21             if(data[j] < value){
    22                 value = data[j];                        //记录每一次的最小值
    23                 index = j;                              //记录每一次的索最小值索引
    24             }
    25         }
    26         
    27         if(index == i){                                 //简单优化
    28             continue;
    29         }
    30         
    31         swap(data[i], data[index]);                      //交换阶段
    32     }
    33 }
    34 
    35 int main(){                                              //测试代码
    36     int str[] = {34, 23, 4, 78, 1, 0, 45, 9, 33, 6, 234};
    37     int len = sizeof(str) / sizeof(int);
    38     selectSort(str, len);
    39     
    40     for(int k = 0; k < len; k++){
    41         cout<< str[k]<< ' '; 
    42     } 
    43     
    44     return 0;
    45 }
  • 相关阅读:
    分分钟用上C#中的委托和事件
    AutoResetEvent详解
    C#跨线程调用
    多线程编程的注意事项
    C#中WinForm程序退出方法技巧总结
    用c#实现单链表(程序代码已经验证,完全正确)
    event & EventHandler
    Kubernetes理论02
    centos7 日志文件
    CentOS7 FTP安装与配置
  • 原文地址:https://www.cnblogs.com/dormant/p/5317140.html
Copyright © 2020-2023  润新知