2.2选择排序

本文详细介绍了选择排序的基本原理,通过代码实例演示了其工作流程,重点讲解了算法步骤和时间复杂度O(n^2)。

2.2、选择排序

2.2.1、基本介绍

选择排序(select sorting)也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。

选择排序思想:
第一次从arr[0]~arr[n-1]中选取最小值,与 arr[0]交换;
第二次从arr[1]~arr[n-1]中选取最小值,与 arr[1]交换;
第三次从arr[2]~arr[n-1]中选取最小值,与arr[2l交换;
…,
第i次从arr[i-1]~arr[n-1]中选取最小值,与arr[i-1]交换;
…,
第n-l 次从 arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换;
总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
在这里插入图片描述
在这里插入图片描述

2.2.2、代码实例

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
//选择排序
public class SelectSort {

	public static void main(String[] args) {
		//int [] arr = {101, 34, 119, 1, -1, 90, 123};
		
		//创建要给80000个的随机的数组
		int[] arr = new int[80000];
		for (int i = 0; i < 80000; i++) {
			arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
		}
		
		System.out.println("排序前");
		//System.out.println(Arrays.toString(arr));
		
		Date data1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(data1);
		System.out.println("排序前的时间是=" + date1Str);
		
		selectSort(arr);
		
		
		Date data2 = new Date();
		String date2Str = simpleDateFormat.format(data2);
		System.out.println("排序前的时间是=" + date2Str);
		
		//System.out.println("排序后");
		//System.out.println(Arrays.toString(arr));
		
		
	}
	
	//选择排序
	public static void selectSort(int[] arr) {
		//选择排序时间复杂度是 O(n^2)
		for (int i = 0; i < arr.length - 1; i++) {
			int minIndex = i;
			int min = arr[i];
			for (int j = i + 1; j < arr.length; j++) {
				if (min > arr[j]) { // 说明假定的最小值,并不是最小
					min = arr[j]; // 重置min
					minIndex = j; // 重置minIndex
				}
			}

			// 将最小值,放在arr[0], 即交换
			if (minIndex != i) {
				arr[minIndex] = arr[i];
				arr[i] = min;
			}

			//System.out.println("第"+(i+1)+"轮后~~");
			//System.out.println(Arrays.toString(arr));// 1, 34, 119, 101
		}
		
		
		
		
		/*
		
		//使用逐步推导的方式来,讲解选择排序
		//第1轮
		//原始的数组 : 	101, 34, 119, 1
		//第一轮排序 :   	1, 34, 119, 101
		//算法 先简单--》 做复杂, 就是可以把一个复杂的算法,拆分成简单的问题-》逐步解决
		
		//第1轮
		int minIndex = 0;
		int min = arr[0];
		for(int j = 0 + 1; j < arr.length; j++) {
			if (min > arr[j]) { //说明假定的最小值,并不是最小
				min = arr[j]; //重置min
				minIndex = j; //重置minIndex
			}
		}
		
		
		//将最小值,放在arr[0], 即交换
		if(minIndex != 0) {
			arr[minIndex] = arr[0];
			arr[0] = min;
		}
		
		System.out.println("第1轮后~~");
		System.out.println(Arrays.toString(arr));// 1, 34, 119, 101
		
		
		//第2轮
		minIndex = 1;
		min = arr[1];
		for (int j = 1 + 1; j < arr.length; j++) {
			if (min > arr[j]) { // 说明假定的最小值,并不是最小
				min = arr[j]; // 重置min
				minIndex = j; // 重置minIndex
			}
		}

		// 将最小值,放在arr[0], 即交换
		if(minIndex != 1) {
			arr[minIndex] = arr[1];
			arr[1] = min;
		}

		System.out.println("第2轮后~~");
		System.out.println(Arrays.toString(arr));// 1, 34, 119, 101
		
		//第3轮
		minIndex = 2;
		min = arr[2];
		for (int j = 2 + 1; j < arr.length; j++) {
			if (min > arr[j]) { // 说明假定的最小值,并不是最小
				min = arr[j]; // 重置min
				minIndex = j; // 重置minIndex
			}
		}

		// 将最小值,放在arr[0], 即交换
		if (minIndex != 2) {
			arr[minIndex] = arr[2];
			arr[2] = min;
		}

		System.out.println("第3轮后~~");
		System.out.println(Arrays.toString(arr));// 1, 34, 101, 119 */

		
	}
}
<think>好的,我现在需要帮助用户使用C++对浮点数数组进行排序。用户给出的例子是数组3.2、1.1、8.5、4.22.2。首先,我得回顾一下C++中sort函数的用法,特别是如何处理浮点数的排序。 根据引用[4],sort函数属于algorithm库,默认是升序排列,可以通过greater<T>()改为降序。那对于浮点数组,应该和整数类似,但需要注意浮点数的比较是否会有精度问题。不过一般情况下,直接比较应该没问题。 用户给的示例是浮点数,所以需要确认数组的类型是float或double。在C++中,声明数组时应该用正确的类型,比如float arr[] = {3.2f, 1.1f, 8.5f, 4.2f, 2.2f};或者double。使用float的话,最好加上f后缀,避免类型转换问题。 接下来,如何调用sort函数。对于数组,sort的参数应该是首指针和尾后指针。比如,如果数组名为arr,长度是n,那么sort(arr, arr+n)。如果使用vector的话,可以用begin()和end()迭代器,但用户这里明确提到是数组,所以用指针的方式。 用户可能需要升序或降序排列,所以需要展示两种方式。根据引用[2],可以自定义比较函数,或者使用标准库提供的比较器。例如,升序使用默认的less<float>(),而降序使用greater<float>()。需要注意的是,使用greater时需要包含functional头文件吗?根据引用[4]中的例子,应该是需要的,或者可能在某些编译环境下不需要,但为了可移植性,最好包含<functional>。 另外,用户给出的示例代码中有使用std::sort进行vector排序的例子,但用户的问题是关于数组的。所以需要调整代码,直接对数组操作。例如: #include <iostream> #include <algorithm> #include <functional> // 为了使用std::greater int main() { float arr[] = {3.2f, 1.1f, 8.5f, 4.2f, 2.2f}; int n = sizeof(arr) / sizeof(arr[0]); // 升序排序 std::sort(arr, arr + n); // 降序排序 // std::sort(arr, arr + n, std::greater<float>()); for (int i = 0; i < n; ++i) { std::cout << arr[i] << " "; } return 0; } 这样应该可以正确排序浮点数组。需要注意的是,浮点数的精度问题可能会影响比较结果,但在这个例子中,数组元素都是明确的,不会有问题。此外,如果用户需要自定义排序规则,比如按照绝对值排序,那需要自己写比较函数,但用户的问题中没有提到这个需求,所以暂时不需要考虑。 另外,检查一下引用的内容是否正确。引用[4]提到sort函数的平均时间复杂度是O(N log N),这对于用户的问题来说可能不需要深入讨论,但可以提及一下性能,让用户知道sort是高效的。 最后,用户可能需要完整的示例代码,包括输出结果。例如,升序后的数组是1.1, 2.2, 3.2, 4.2, 8.5,降序则相反。确保代码中的浮点数正确使用f后缀,避免警告或类型不匹配的问题。 总结步骤:包含必要的头文件,定义数组和长度,调用sort函数,输出结果。同时提供升序和降序的选项,并解释如何切换。</think>要使用C++对浮点数数组进行排序,可以通过标准库函数 `std::sort` 实现。以下是具体步骤和示例代码: --- ### **1. 升序排序** 默认情况下,`std::sort` 按升序排列。 **代码示例**: ```cpp #include <iostream> #include <algorithm> // 包含sort函数 int main() { float arr[] = {3.2f, 1.1f, 8.5f, 4.2f, 2.2f}; int n = sizeof(arr) / sizeof(arr[0]); // 升序排序 std::sort(arr, arr + n); // 输出结果 for (int i = 0; i < n; i++) { std::cout << arr[i] << " "; } return 0; } ``` **输出**: ``` 1.1 2.2 3.2 4.2 8.5 ``` --- ### **2. 降序排序** 使用 `std::greater<float>` 作为比较函数实现降序排序[^4]。 **代码示例**: ```cpp #include <iostream> #include <algorithm> #include <functional> // 包含std::greater int main() { float arr[] = {3.2f, 1.1f, 8.5f, 4.2f, 2.2f}; int n = sizeof(arr) / sizeof(arr[0]); // 降序排序 std::sort(arr, arr + n, std::greater<float>()); // 输出结果 for (int i = 0; i < n; i++) { std::cout << arr[i] << " "; } return 0; } ``` **输出**: ``` 8.5 4.2 3.2 2.2 1.1 ``` --- ### **关键点** 1. **数组长度计算**:`sizeof(arr) / sizeof(arr[0])` 用于动态获取数组长度。 2. **浮点数精度**:建议在浮点数后添加 `f` 后缀(如 `3.2f`),以明确使用单精度浮点数。 3. **时间复杂度**:`std::sort` 的平均时间复杂度为 $O(N \log N)$,适合大多数场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值