排序算法--------冒泡排序

冒泡排序是是简单排序算法之一,通过比较相邻两个元素,当第一个元素比第二个元素大的时候就把第一个元素往后移(升序,同理可以达成降序),每趟排序后,必定有一个最大或者最小值在最后。

第一种冒泡排序

 1         static void BubbleSort<T>(T[] arr)where T : IComparable<T>
 2         {
 3             //决定排序的趟数
 4             for(int i = 0; i < arr.Length; i++)
 5             {
 6                 //每当排过一次减少I个元素,I后以排序完
 7                 for(int j=0;j<arr.Length-i-1;j++)
 8                 {
 9                     if(arr[j].CompareTo(arr[j+1])>0)
10                     {
11                         //交换算法
12                         var temp = arr[j];
13                         arr[j] = arr[j + 1];
14                         arr[j + 1] = temp;
15                     }
16                     
17                 }
18                 Print(arr);
19             }
20         }

这种冒泡排序,能够进行进一步优化,因为排序完成后,还在排序。所以能够在外层定义一个变量来表示其是否排序,这里用bool值

 1     static void BubbleSort<T>(T[] arr) where T : IComparable<T>
 2         {
 3             //决定排序的趟数
 4             for (int i = 0; i < arr.Length; i++)
 5             {
 6                 //定义一个用来确定是否正在排序
 7                 var Sorting = false;
 8                 //每当排过一次减少I个元素,I后以排序完
 9                 for (int j = 0; j < arr.Length - i - 1; j++)
10                 {
11                     if (arr[j].CompareTo(arr[j + 1]) > 0)
12                     {
13                         //交换算法
14                         var temp = arr[j];
15                         arr[j] = arr[j + 1];
16                         arr[j + 1] = temp;
17                         Sorting = true;
18                     }
19 
20                 }
21                 if(Sorting==false)
22                 {
23                     break;
24                 }
25                 Print(arr);
26             }
27         }

冒泡排序还有第三种优化方法,排序完后,当后方已经排序完成后,不需要再继续进行比较.

 1         static void BubbleSort<T>(T[] arr)where T : IComparable<T>
 2         {
 3             //记录最后一次的交换位置
 4             int lastExChangeIndex = 0;
 5             //无序数列的边界,每次比较到这里就停止
 6             int sortBorder = arr.Length - 1;
 7             //决定走过的趟数
 8             for(int i=0;i<arr.Length;i++)
 9             {
10                 var Sorting = false;
11                 //决定比较的次数,每次排序后 必定有一个最大的在最后面 所以每走一趟-i
12                 for (int j=0;j< sortBorder; j++)
13                 {   
14                     if(arr[j].CompareTo(arr[j+1])>0)
15                     {
16                         //交换算法
17                         var temp = arr[j];
18                         arr[j] = arr[j + 1];
19                         arr[j + 1] = temp;
20                         //排序中
21                         Sorting=true;
22                         //把无序数列的边界更新为最后一次交换元素的位置
23                         lastExChangeIndex = j;
24                     }
25                 }
26                 sortBorder = lastExChangeIndex;
27                 //如果排序已完成就退出
28                 if(Sorting==false)
29                 {
30                     break;
31                 }
32                 Print(arr);
33             }
34         }

 

posted @ 2019-07-06 02:22  RpeatAndRepat  阅读(200)  评论(0)    收藏  举报