首页 > 代码库 > c#排序

c#排序

插入排序:

 1  class Class1
 2     {
 3         /*先将第一个记录视为一个有序序列,然后依次将后面的记录插入到这个有序序列中来。
 4          * 每次要插入的记录时,须从后往前依次比较有序序列中的记录,直到找到在有序序列中的位置,
 5          * 记录下该位置,该位置开始的每个记录都后移一位,然后将插入记录插入该位置。这样每插入一个记录进去,
 6          * 有序序列长度加1,剩余记录减1,直到所有记录都插入到有序序列中,排序完成。*/
 7         public void InsertionSort()///插入排序法
 8         {
 9             int[] arr = new int[]{30,45,54,13,49,45};
10             int inner, temp;
11             for (int outer = 1; outer <= arr.Length-1; outer++)//每当一次内层循环,有序序列加1
12             {
13                 temp = arr[outer];//temp代表要插入的数
14                 inner = outer;
15                 while (inner > 0 && arr[inner - 1] >= temp)//inner-1代表有序序列的最大值索引,每次循环减1
16                 {
17                     arr[inner] = arr[inner - 1];//有序记录后移
18                     inner--;
19                 }
20                 arr[inner] = temp;
21             }
22             foreach(int i in arr)
23             {
24                 Console.WriteLine(i);
25             }
26             Console.ReadKey();
27         }
28     }

 

基本冒泡排序法:

 1  public void BubbleSort()///基本冒泡排序法
 2         {
 3             int temp;
 4             for (int outer = upper; outer > 0; outer--)//因为最后只有一个数的时候,就是最小的,不用再排,所以outer>0
 5             {
 6                 for (int inner = 0; inner < outer; inner++)//内层遍历每次遍历中都把最大的数排到了最后
 7                 {
 8                     if (arr[inner] > arr[inner + 1])   //从第一个数开始遍历,前面一个比后面一个大进行交换;temp是一个局部变量,用来存放交换过程中的值
 9                     {
10                         temp = arr[inner];
11                         arr[inner] = arr[inner + 1];
12                         arr[inner + 1] = temp;
13                     }
14                 }
15             }
16        }

改进冒泡排序:

/*改进冒泡比基本冒泡多了一个i=0的判断,应该是多了一种特殊情况的判断若记录序列的初始状态为"正序",
         * 则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,没有进入if判断和交换
         * 且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动*/
       public void BubbleSort()///改进冒泡排序法
        {
            int temp, i;
            for (int outer = upper; outer > 0; outer--)
            {
                i = 0;
                for (int inner = 0; inner < outer; inner++)
                {
                    if (arr[inner] > arr[inner + 1])
                    {
                        temp = arr[inner];
                        arr[inner] = arr[inner + 1];
                        arr[inner + 1] = temp;
                        i++;
                    }
                }
                if (i == 0)
                    break;
            }
        }

选择排序法:

 1  public void SelectionSort()///选择排序法
 2         {
 3             int min, temp;
 4             for (int outer = 0; outer <= upper; outer++)
 5             {
 6                 min = outer;                       //min代表数组未排序部分最前面的索引
 7                 for (int inner = outer + 1; inner <= upper; inner++)//再一次遍历中会找到数组最小数的索引
 8                 {
 9                     if (arr[inner] < arr[min])     //如果数组的后一个数小于被比较的数
10                         min = inner;               //就将后一个数的索引赋值给min
11                 }
12                 temp = arr[outer];            //outer代表了在一次遍历中被比较数的索引,min代表了在一次遍历中最小数的索引,
13                 arr[outer] = arr[min];       //把这两个数交换
14                 arr[min] = temp;
15             }
16         }