算法 选择排序-请教一个选择排序的算法问题

问题描述

请教一个选择排序的算法问题

你好, 我刚刚开始接触JAVA, 问一个选择排序的问题。
private static void SelectionSort (int[] arr) {
for(int i=0; i
for(int j=i+1;j
if (arr[i] > arr[j]) {
int m;
m = arr[i];
arr[i] = arr[j];
arr[j] = m;
}
}
}
}
这个方法正确,但是交换次数多了,所以我想改进一下。
private static void SelectionSort (int[] arr) {
int min;
for(int i=0; i
min = arr[i];
for(int j=i+1;j
if (arr[i] > arr[j]) {
min = arr[j];
}
}
if (arr[i] > min) {
int t;
t = min;
min = arr[i];
arr[i] = t;
}
}
}
这是我改进后的方法,结果是不对的,我想知道我的思路哪里错了。 我想的是每次循环开始的时候设一个min, 将arr[i]赋给min,当有arr[i]比arr[j]大的时候就把arr[j]赋给min,内层循环结束了之后做一次交换。

解决方案

当然不对。
首先你根本没有概念。第一个程序是冒泡排序,不是选择排序。
第二个程序大体上是选择排序了,但是你要知道,在Java中,int是值类型。你定义了一个min,然后交换arr[i]和min,是不会真正交换的。
你应该定义一个minindex的变量,记录最小值的index,这样才行。

解决方案二:

这种问题的解决方法是自己进行单步调试,一步一步的分析执行的结果,看是否与自己想要的结果相同。
相同,就不用说了;如果不相同,分析一下不相同的原因,就找到问题产生的原因了。

时间: 2024-10-01 05:58:15

算法 选择排序-请教一个选择排序的算法问题的相关文章

sql-求助:请教一个SQL语句的算法

问题描述 求助:请教一个SQL语句的算法 业务逻辑:在财务中,在一个结算周期内的结算金额没有达到结算限额,则此次不做结算,将此次结算金额累计到下一个结算周期内结算,直到满足结算限额才结算.其中每一个合同的计算限额不同. 举例:已知的合同号001的结算限额为200 ,合同号002的结算限额为300 合同号A 结算日B 结算金额C 想得到的结果D 001 1.1 100 0 001 2.1 110 210 001 3.1 120 0 001 4.1 130 250 001 5.1 140 0 001

请教一个关于时间段的算法,最好是有现成的函数

问题描述 小弟正在做一个质量考评系统,遇到了个时间段上的算法的问题,问题如下:当用户登入进去后,得到当时的日期,现在自定义每月X号进行统计,如果当前日期小于X号,得到上个月X号到当前日期的时间段,如果大于X号,得到当前月X号+1到当前时间的时间段 解决方案 解决方案二:我感觉只要利用函数提取出年,月,日进行比较就行,你看一下有你需要的吗:http://blog.csdn.net/hhxxcj/archive/2009/01/15/3785913.aspx解决方案三:楼上的,但是基本函数,我知道,

请教一个穷举的算法:)列出字符串

问题描述 问题描述:现在想从ABCD四个字符想穷举后得到:ABCDAAABACADAAAAABAACAADABAABBABCABDACAACBACCACDADAADBADCADD.....DDDDD等等,不计各个位数,但最长的长度为5即DDDDD,求出各种字符组合.请教高手指点:) 解决方案 解决方案二:四进制!!!代码就不用写了吧解决方案三:请问要怎么做四进制呢?还有要是如果字符更多,穷举的长度也变长呢?请教:)解决方案四:又是一个全排列问题.解决方案五:楼上的有好招么?请教:)解决方案六:[

《趣题学算法》—第0章0.4节算法的正确性

0.4 算法的正确性 解决一个计算问题的算法是正确的,指的是对问题中任意合法的输入均应得到对应的正确输出.大多数情况下,问题的合法输入无法穷尽,当然就无法穷尽输出是否正确的验证.即使合法输入是有限的,穷尽所有输出正确的验证,在实践中也许是得不偿失的.但是,无论如何,我们需要保证设计出来的算法的正确性.否则,算法设计就是去了它的应用意义.因此,对设计出来的算法在提交应用之前,应当说明它的正确性.这就需要借助我们对问题的认识与理解,利用数学.科学及逻辑推理来证实算法是正确的.例如,对于解决"计算逆序

常见的五类排序算法图解和实现(选择类:简单选择排序,锦标赛排序,树形选择排序,堆排序)

选择类的排序算法 简单选择排序算法 采用最简单的选择方式,从头到尾扫描待排序列,找一个最小的记录(递增排序),和第一个记录交换位置,再从剩下的记录中继续反复这个过程,直到全部有序. 具体过程: 首先通过 n –1 次关键字比较,从 n 个记录中找出关键字最小的记录,将它与第一个记录交换. 再通过 n –2 次比较,从剩余的 n –1 个记录中找出关键字次小的记录,将它与第二个记录交换. 重复上述操作,共进行 n –1 趟排序后,排序结束. 如图   过程图解 令 k=i:j = i + 1: 目

c-大神们!编译时特殊标记行为什么通不过编译,错在哪?这是一个选择排序的程序!

问题描述 大神们!编译时特殊标记行为什么通不过编译,错在哪?这是一个选择排序的程序! #include int main() { void sort(int array[],int n); int n,i; scanf("%d",&n); int a[200]; for(i=0;i<n;i++) scanf("%d",&a[i]); ** void (a,n);** for(i=0;i<n;i++) printf("%d&quo

排序高级之选择排序_选择排序

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换.在所有的完全依靠交换去移动元素的排序方

数据结构例程——选择排序之直接选择排序

本文是[数据结构基础系列(9):排序]中第6课时[选择排序之直接选择排序]的例程. #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定义 void Sele

排序 list-360 笔试题 下列哪个算法是对一个list排序的最快方法()

问题描述 360 笔试题 下列哪个算法是对一个list排序的最快方法() 下列哪个算法是对一个list排序的最快方法() 快速排序 冒泡排序 二分插入排序 线性排序 解决方案 我认为,是冒泡 .... 解决方案二: 二分插入排序法. 楼主可以去看Collections.sort(list);的排序算法,就是用的二分插入排序. 解决方案三: 二分. 不过 这也要看情况的, 数据大小的不同 是不一样的,若list里边只有一个数据呢?两个呢?. 解决方案四: 同时你也可以去看看 STL 里边的 lis