java
主页 > 软件编程 > java >

C#实现选择排序的方法

2022-08-14 | F11站长开发者 | 点击:

选择排序是一种低效的排序算法,大致过程是:遍历数组的每一个元素,先假设0号位置上的元素是最小的,并把0号索引赋值给一个表示最小元素索引的变量,比如说是smallest,再遍历0号位置以后的元素,一旦发现有比0号位置元素更小的元素,就把该元素的索引赋值给smallest,继续遍历,最终把0号位置以后最小元素的索引赋值给了smallest变量,再把0号位置和smallest位置上的元素互换,这样,在0号位置上放上了最小元素。接着,在1号位置放上倒数第二小的元素,在2号位置放上倒数第三小的元素......以此类推,最终得到一个升序排列的数组。由于是依次循环遍历数组元素,个人更愿意把选择排序理解成线性排序。

自定义一个类,里面维护着一个int[]类型数组,通过构造函数定义数组长度并初始化,并提供了打印和选择排序的相关方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

public class MyArray

 {

     private static int[] arr;

     private static Random r = new Random();

     public MyArray(int size)

     {

         arr = new int[size];

         for (int i = 0; i < size; i++)

         {

             arr[i] = r.Next(1, 100);

         }

     }

     //选择排序算法

     public void Sort()

     {

         int smallest; //最小元素的索引

         //最后一个索引位置不需要遍历,因为在代码段的内部循环中包含了对最后一个索引位置的处理

         for (int i = 0; i < arr.Length - 1; i++)

         {

             //把当前遍历的元素的索引赋值给smallest,即假设当前遍历的数组元素为最小元素

             smallest = i;

             //遍历当前遍历元素后面的所有元素

             //获取最小元素的索引

             for (int index = i + 1; index < arr.Length; index++)

             {

                 if (arr[index] < arr[smallest])

                 {

                     smallest = index;

                 }

             }

             //把当前遍历元素和最小元素交换位置

             Swap(i, smallest);

             //每次排完序打印

             Print();

         }

     }

     //交换2个位置上的元素

     public void Swap(int first, int second)

     {

         int temp = arr[first];

         arr[first] = arr[second];

         arr[second] = temp;

     }

     //打印数组元素

     public void Print()

     {

         foreach (var item in arr)

         {

             Console.Write(item + " ");              

         }

         Console.WriteLine("\n");

     }

 }

客户端调用。

1

2

3

4

5

6

7

8

9

10

11

12

class Program

{

    static void Main(string[] args)

    {

        MyArray myArray = new MyArray(8);

        Console.Write("排序前: ");

        myArray.Print();

        Console.WriteLine("排序后: ");

        myArray.Sort();

        Console.ReadKey();

    }

}

可见,对选择排序来说,外部循环进行了n-1次迭代,内部循环第一次进行了n-1迭代,第二次进行了n-2次迭代……以时间复杂度来说,忽略小项和常数项,选择排序基本上是一个平方阶,写成O(n²)。

原文链接:https://www.cnblogs.com/darrenji/p/3874778.html
相关文章
最新更新