算法导论Java实现-选择排序(习题2.2-2)

简介:

 

 
  1. package lhz.algorithm.chapter.two; 
  2.  
  3. /** 
  4.  * 《选择排序》,《算法导论》习题2.2-2  
  5.  * Consider sorting n numbers stored in array A by first 
  6.  * finding the smallest element of A and exchanging it with the element in A[1]. 
  7.  * Then find the second smallest element of A, and exchange it with A[2]. 
  8.  * Continue in this manner for the first n - 1 elements of A. Write pseudocode 
  9.  * for this algorithm, which is known as selection sort . What loop invariant 
  10.  * does this algorithm maintain? Why does it need to run for only the first n - 
  11.  * 1 elements, rather than for all n elements? Give the best-case and worst- 
  12.  * case running times of selection sort in Θ- notation.  
  13.  * 伪代码: 
  14.  *  for i <- 1 to length[A]-1 
  15.  *      key <- A[i] 
  16.  *      index <- i 
  17.  *      for j <- 2 to length[A] 
  18.  *          key = key < A[j] ? key : A[j]; 
  19.             index = key < A[j] ? index : j; 
  20.  *      A[index] = A[i]; 
  21.         A[i] = key;  
  22.  * @author lihzh(苦逼 coder) 
  23. * 本文地址:http://mushiqianmeng.blog.51cto.com/3970029/728872
  24.  */ 
  25. public class SelectionSort { 
  26.      
  27.     private static int[] input = new int[] { 21549867103 }; 
  28.  
  29.     /** 
  30.      * @param args 
  31.      */ 
  32.     public static void main(String[] args) { 
  33.         for (int i=0; i<input.length-1; i++) {//复杂度数量级:n 
  34.             int key = input[i]; 
  35.             int index = i; 
  36.             //比较当前值和下一个值的关系,记录下较小值的值和索引数,用于交换。 
  37.             for (int j=i+1; j<input.length; j++) {//复杂度:1+2+...+(n-1)=Θ(n^2)
  38.                 key = key < input[j] ? key : input[j]; 
  39.                 index = key < input[j] ? index : j; 
  40.             } 
  41.             input[index] = input[i]; 
  42.             input[i] = key; 
  43.         } 
  44.         /* 
  45.          * 复杂度分析: 
  46.          * 最坏情况下,复杂度为:n*n=n^2(若略微精确的计算即为:n-1+1+2+...+n-1=(2+n)*(n-1)/2, 
  47.          * 所以复杂度仍为n^2。 
  48.          * 最优情况下,由于不论原数组是否排序好,均需要全部遍历以确定当前的最小值,所以复杂度不变仍未n^2。 
  49.          *  
  50.          */ 
  51.         //打印数组 
  52.         printArray(); 
  53.     } 
  54.      
  55.     private static void printArray() { 
  56.         for (int i : input) { 
  57.             System.out.print(i + " "); 
  58.         } 
  59.     } 
  60.  

  

 
  1. package lhz.algorithm.chapter.two; 
  2.  
  3. /** 
  4.  * 《选择排序》,《算法导论》习题2.2-2  
  5.  * Consider sorting n numbers stored in array A by first 
  6.  * finding the smallest element of A and exchanging it with the element in A[1]. 
  7.  * Then find the second smallest element of A, and exchange it with A[2]. 
  8.  * Continue in this manner for the first n - 1 elements of A. Write pseudocode 
  9.  * for this algorithm, which is known as selection sort . What loop invariant 
  10.  * does this algorithm maintain? Why does it need to run for only the first n - 
  11.  * 1 elements, rather than for all n elements? Give the best-case and worst- 
  12.  * case running times of selection sort in Θ- notation.  
  13.  * 伪代码: 
  14.  *  for i <- 1 to length[A]-1 
  15.  *      key <- A[i] 
  16.  *      index <- i 
  17.  *      for j <- 2 to length[A] 
  18.  *          key = key < A[j] ? key : A[j]; 
  19.             index = key < A[j] ? index : j; 
  20.  *      A[index] = A[i]; 
  21.         A[i] = key;  
  22.  * @author lihzh(苦逼 coder) 
  23. * 本文地址:http://mushiqianmeng.blog.51cto.com/3970029/728872
  24.  */ 
  25. public class SelectionSort { 
  26.      
  27.     private static int[] input = new int[] { 21549867103 }; 
  28.  
  29.     /** 
  30.      * @param args 
  31.      */ 
  32.     public static void main(String[] args) { 
  33.         for (int i=0; i<input.length-1; i++) {//复杂度数量级:n 
  34.             int key = input[i]; 
  35.             int index = i; 
  36.             //比较当前值和下一个值的关系,记录下较小值的值和索引数,用于交换。 
  37.             for (int j=i+1; j<input.length; j++) {//复杂度:1+2+...+(n-1)=Θ(n^2)
  38.                 key = key < input[j] ? key : input[j]; 
  39.                 index = key < input[j] ? index : j; 
  40.             } 
  41.             input[index] = input[i]; 
  42.             input[i] = key; 
  43.         } 
  44.         /* 
  45.          * 复杂度分析: 
  46.          * 最坏情况下,复杂度为:n*n=n^2(若略微精确的计算即为:n-1+1+2+...+n-1=(2+n)*(n-1)/2, 
  47.          * 所以复杂度仍为n^2。 
  48.          * 最优情况下,由于不论原数组是否排序好,均需要全部遍历以确定当前的最小值,所以复杂度不变仍未n^2。 
  49.          *  
  50.          */ 
  51.         //打印数组 
  52.         printArray(); 
  53.     } 
  54.      
  55.     private static void printArray() { 
  56.         for (int i : input) { 
  57.             System.out.print(i + " "); 
  58.         } 
  59.     } 
  60.  

      本文转自mushiqianmeng 51CTO博客,原文链接:http://blog.51cto.com/mushiqianmeng/728872,如需转载请自行联系原作者




相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
95 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
4月前
|
搜索推荐 Java 索引
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
2月前
|
Java 数据安全/隐私保护
JAVA经典习题详解
JAVA经典习题详解
25 4
|
2月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
25 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
93 2
|
2月前
|
搜索推荐 Java Go
深入了解选择排序算法
深入了解选择排序算法
31 4
|
2月前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
46 0
|
2月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
35 0