【黑马程序员】3.C#基础之排序方法总结

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

1.     冒泡排序法

冒泡排序法的思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。

在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。

如此下去,重复以上过程,直至最终完成排序。

下面用一个例子来演示冒泡排序法的执行过程:

    原始顺序:60,30,80,10,70,20,50,90,40

    第一趟:30,60,10,70,20,50,80,40,90

    第二趟:30,10,60,20,50,70,40,80,90

    第三趟:10,30,20,50,60,40,70,80,90

    第四趟:10,20,30,50,40,60,70,80,90

    第五趟:10,20,30,40,50,60,70,80,90

    第六趟:10,20,30,40,50,60,70,80,90

    第七趟:10,20,30,40,50,60,70,80,90

    第八趟:10,20,30,40,50,60,70,80,90

小结一下:

1)        用冒泡排序,n 个数需要进行n-1 趟外层循环;

2)        j 趟循环中需要进行n-j次两两比较(内循环)。

代码:

      static void Main(string[] args)
      {
            int[] a = { 60, 30, 80, 10, 70, 20, 50, 90, 40 };
            int[] sorted1 = BubbleSort(a);  //调用冒泡排序方法
              Console.WriteLine("从小到大排序,冒泡排序法得到的结果为:");
            for (int i = 0; i < sorted1.Length; i++)//循环输出排序后的数组元素
              {
                Console.Write(sorted1[i] + " ");
            }
            Console.ReadKey();
          }
          public static int[] BubbleSort(int[] arr)//冒泡排序法
       	  {
            int temp;
            for (int i = 0; i < arr.Length - 1; i++)//外层循环控制趟数,循环一次表示比较了一趟
              {
                for (int j = 0; j < arr.Length - 1 - i; j++)//内层控制第i趟需要进行的两两比较的次数
                  {
                    if (arr[j] > arr[j + 1])
                    {
                        temp = arr[j];//交换位置,把较大数放到后边
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            return arr;
         }

输出:

2.     选择排序法

选择排序的思想:已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],以此类推,最后比较a[1]与a[n]的值。这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。再将a[3]与a[4]~a[n]以相同方法比较一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。

代码:                  

	static void Main(string[] args)
        {
            int[] b= { 40, 90, 10, 70, 50, 80, 20, 60, 30 };
            int[] sorted2=SelectionSort(b);//调用选择排序法
              Console.WriteLine("从小到大排序,选择排序法得到的结果为:");
            for (int i=0; i<sorted2.Length; i++)
            {
                Console.Write(sorted2[i] +" ");
            }
            Console.ReadKey();
        }
        public static int[] SelectionSort(int[] arr)//选择排序法
         {
            int min;
            for (int i=0; i<arr.Length-1; i++) //控制循环的趟数
              {
                min=i;
                for (int j=i+1; j<arr.Length ; j++)
                {
                    if (arr[j] <arr[min])
                        min=j;
                }
                int temp=arr[min]; //交换位置,把较小数放到arr[min]的位置
                  arr[min] =arr[i];
                arr[i] =temp;
            }
            return arr;
        } 

输出:

3.     插入排序法

插入排序算法执行过程:

⒈ 从第一个元素开始,该元素可以认为已经被排序

⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描

⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置

⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

⒌ 将新元素插入到下一位置中

⒍ 重复步骤2

代码:

        static void Main(string[] args)
        {
            int[] c= { 3, 1, 8, 5, 0, 4, 2, 9, 7, 6 };
            int[] sorted3=InsertionSort(c);//调用插入排序法
              Console.WriteLine("从小到大排序,插入排序法得到的结果为:");
            for (int i=0; i<c.Length; i++)
            {
                Console.Write(sorted3[i]+" ");
            }
            Console.ReadKey();
        }
        public static int[] InsertionSort(int[] list)
        {
            for (int i=1; i<list.Length; i++)
            {
                int t=list[i];//要插入的数
                  int j=i;//定义游标
                  //要插入的数字从后向前与每一个元素依次进行比较
                  while ((j>0) && (list[j-1] >t))//如果前一个元素大于要插入的t
                {
                    list[j] =list[j-1];//使前一个元素(较大的)后¨移一位
                       --j;//游标向前走,继续与前边的元素进行比较?
                }
                list[j] =t;//如果前一个元素不大于t,则把t插入到该元素之后这个位置
              }
            return list;
        }

输出:

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值