n个数排序,最坏情况下的最小交换次数是多少

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n个数排序,最坏情况下的最小交换次数是多少相关的知识,希望对你有一定的参考价值。

最坏的情况是圆排列的情况,也称循环排列,最少需要n-1次对换变为标准排列。另外,任意n阶排列最多可经n-1次对换变为标准排列。所谓标准排列就是12...n 参考技术A 最坏情况下,是整个序列都已经有序且完全倒序 ,
此时,快速排序退化为冒泡排序,要比较n*(n-1)/2次才能完成
最好的情况下只需一次!

数据结构 - 选择排序



选择排序是一种简单的排序算法。此排序算法是一种基于就地比较的算法,其中,列表分为两部分,左端为已排序部分,右端为未排序部分。最初,已排序部分为空,未排序部分为整个列表。

从未排序的数组中选择最小的元素,并与最左边的元素交换,该元素成为排序数组的一部分。此过程继续将未排序的数组边界向右移动一个元素。

该算法不适用于大型数据集,因为其平均和最坏情况下的复杂度均为Ο(n^2),其中n是项数。


01.核心思想


以下面描述的数组为例。

对于排序列表中的第一个位置,将顺序扫描整个列表。当前存储14的第一个位置,我们搜索整个列表,发现10是最低值。

数据结构 - 选择排序

因此,我们将10替换为14。一次迭代10(恰好是列表中的最小值)出现在已排序列表的第一位置。

数据结构 - 选择排序

对于第二个位置(33个位置),我们开始以线性方式扫描列表的其余部分。

数据结构 - 选择排序

我们发现14是列表中第二低的值,它应该出现在第二位。我们交换这些值。

数据结构 - 选择排序

经过两次迭代后,两个最小值以排序的方式位于开头。

数据结构 - 选择排序

以下是整个分类过程的图示-

02.代码开发

实现思路

Step 1 − 设置最小值到位置0
Step 2 − 搜索列表中的最小元素
Step 3 − 在MIN位置交换值
Step 4 − 递增MIN以指向下一个元素
Step 5 − 重复直到列表排序

伪代码

package com.paal.demo.c01SortingBasic;import com.paal.demo.Sort;import com.paal.demo.utils.SortTestHelper;/**
* <p/>
* <li>title: 基础排序-选择排序</li>
* <li>@author: li.pan</li>
* <li>Date: 2019/11/4 12:43 下午</li>
* <li>Version: V1.0</li>
* <li>Description: </li>
*/
public class SelectionSort implements Sort { @Override
public void sort(Integer[] arr) { for (int i = 0; i < arr.length; i++) { // 保存最小元素所在位置
int minIndex = i; for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) {
minIndex = j;
}
} // 自定义的用于数组元素交换的函数
SortTestHelper.swap(arr, i, minIndex);
}

}

} /**
* 选择排序测试
*/

@Test
public void selectionSortTest() {
Integer[] integers0 = SortTestHelper.generateRandomArray(100, 0, 1000000);
Integer[] integers1 = SortTestHelper.generateRandomArray(10000, 0, 1000000);
Integer[] integers2 = SortTestHelper.generateRandomArray(100000, 0, 1000000);
System.out.println("------------------------------随机数组--------------------------------");
System.out.println("选择排序测试1"+SortTestHelper.testSort(integers0, new SelectionSort()));
System.out.println("选择排序测试2"+SortTestHelper.testSort(integers1, new SelectionSort()));
System.out.println("选择排序测试3"+SortTestHelper.testSort(integers2, new SelectionSort()));

}

你不一定要点蓝字关注我的



以上是关于n个数排序,最坏情况下的最小交换次数是多少的主要内容,如果未能解决你的问题,请参考以下文章

最少交换次数

算法基础--简单选择排序

简单选择排序

最坏情况比较次数

C语言将一组数从大到小排序 只能移动相邻的数 并且要求步骤最小 怎么设计逻辑

将数列变为有序的最少交换次数