zoukankan      html  css  js  c++  java
  • 001 C/C++ 选择排序法

    简单选择排序:

    选择排序法 是对 定位比较交换法(也就是冒泡排序法) 的一种改进。

    选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。

    简单选择排序的基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

    以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列:
    初始序列:{49 27 65 97 76 12 38}
      第1趟:12与49交换:12{27 65 97 76 49 38}
      第2趟:27不动 :12 27{65 97 76 49 38}
      第3趟:65与38交换:12 27 38{97 76 49 65}
      第4趟:97与49交换:12 27 38 49{76 97 65}
      第5趟:76与65交换:12 27 38 49 65{97 76}
      第6趟:97与76交换:12 27 38 49 65 76 97 完成

    C  code:

     1 void SelectSort( int a[], int length )
     2 {
     3     //对数组a排序,length是数组元素数量
     4     for( int i = 0; i < length; i++ ) {
     5         // 找到从i开始到最后一个元素中最小的元素,k存储最小元素的下标.
     6         int k = i;
     7         for( int j = i + 1; j < length; j++ ) {
     8             if( a[j] < a[k] ) { k = j; }
     9         }
    10 
    11         // 将最小的元素a[k] 和 开始的元素a[i] 交换数据.
    12         if( k != i ) {
    13             int temp;
    14             temp= a[k];
    15             a[k] = a[i];
    16             a[i] = temp;
    17         }
    18     }
    19 }

     选择排序演示程序:

     1 #include "stdio.h"
     2 #include "stdlib.h"
     3 
     4 void printArray( int* a, int length )
     5 {
     6     for( int i = 0; i < length; i++ )
     7     {
     8         printf( "%d ", a[i] );
     9     }
    10     printf( "
    " );
    11 }
    12 
    13 void SelectSort( int a[], int length )
    14 {
    15     //对数组a排序,length是数组元素数量
    16     for( int i = 0; i < length; i++ ) {
    17         // 找到从i开始到最后一个元素中最小的元素,k存储最小元素的下标.
    18         int k = i;
    19         for( int j = i + 1; j < length; j++ ) {
    20             if( a[j] < a[k] ) { k = j; }
    21         }
    22 
    23         // 将最小的元素a[k] 和 开始的元素a[i] 交换数据.
    24         if( k != i ) {
    25             int temp;
    26             temp= a[k];
    27             a[k] = a[i];
    28             a[i] = temp;
    29         }
    30     }
    31 }
    32 
    33 void main()
    34 {
    35     int a[]={ 1,56,8,66,2,57,49,26,68,99,100 };
    36     int length=sizeof( a ) / sizeof( a[0] );
    37     printf( "排序前:" );
    38     printArray( a, length );
    39     SelectSort( a, length );
    40     printf( "排序后:" );
    41     printArray( a, length );
    42     system( "pause" );
    43 }

     Output Result:

    排序前:1 56 8 66 2 57 49 26 68 99 100
    排序后:1 2 8 26 49 56 57 66 68 99 100
    请按任意键继续. . .
    致读者:本人自学编程,知识薄弱,实践经验不够,博客文章难免有错误之处,希望读者能积极指正,感激不尽。 若您有更精妙的解决方案或者对文中有疑问,欢迎留言或联系我讨论问题。
  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/it89/p/11068215.html
Copyright © 2011-2022 走看看