zoukankan      html  css  js  c++  java
  • 冒泡排序,选择排序,快速排序

    简单的排序算法

    冒泡排序:主要是拿数组的两个相邻元素比较大小,然后交换他们之间的位置第一次外层循环确定一个最大(最小值),第二次确定剩余数据中的最大(最小值)依次下去。

    代码:

     1 int []a={1,5,3,7,8,4,9};
     2 
     3 
     4             for (int i = 0; i < a.Length; i++)
     5             {
     6                 Console.Write("{0}	", a[i]);  //输出原始数据
     7             }
     8 
     9             bool IsAsc = false; // true 是升序,false 是降序
    10             Console.WriteLine();
    11             for (int i = 0; i <a.Length-1; i++)//每一次在剩余数据中确定一个最大(最下)存放在a[i],因为最后两个只需要比较一次所以i< a.length-1
    12             {
    13                 for (int j = i+1; j < a.Length; j++) 
    14                 {
    15                     if (IsAsc? a[i] > a[j]:a[i]<a[j]) //比较a[i]与a[j]满足条件就交互a[i]与a[j]的值。
    16                     {
    17                         int temp = a[i];
    18                         a[i] = a[j];
    19                         a[j] = temp;
    20                     
    21                     }
    22                 }
    23             }
    24 
    25 
    26             for (int i = 0; i < a.Length; i++)  //输出排序后的结果
    27             {
    28                 Console.Write("{0}	", a[i]);
    29             }
    30             Console.ReadLine();
    简单说明下原理
    {1,5,3,7,8,4,9}; 按从大到小排序
    i=0,j=1 1与5比 满足条件交换a[0]与a[1] 数组变为 {5,1,3,7,8,4,9}
    i=0,j=2 5与3比 不满足条件 继续循环。
    i=0,j=3 5与7比 满足条件交换a[0]与a[3] 数组变为 {7,1,3,5,8,4,9}
    依次类推,但里面的j循环完后 ,9就到了a[0]的位置
    然后 i=1,j=2 又走上面的步骤。8就到了a[1]的位置。
    当i=6时退出循环所有的数也排好了。

    选择排序:顾名思义,每一次循环选择一个满足条件的数据放到对应的位置。比如第一循环 找到最大值下标与a[0]交换,第二次 找到剩余数据最大值下标 与a[1]交换 依次类推。

    代码:
     1             int []a={1,5,3,7,8,4,9};
     2 
     3 
     4             for (int i = 0; i < a.Length; i++)
     5             {
     6                 Console.Write("{0}	", a[i]);
     7             }
     8 
     9             bool IsAsc = true;
    10             Console.WriteLine();
    11            
    12             for (int i = 0; i <a.Length-1; i++)
    13             {
    14                 int index = i;  //默认下标为i的就是满足条件
    15                 for (int j = i+1; j < a.Length; j++)
    16                 {
    17                     if (IsAsc? a[index] > a[j]:a[index]<a[j])  //每次下标为j的满足条件 就把index记录为j.
    18                     {
    19                         index = j;                    
    20                     }
    21                 }
    22 
    23                 if (index != i)  //当index不等于i时说明找到了真的满足条件(找到了真正的最大(最小)值下标)就与下标为i的数进行交换
    24                 {
    25                     int temp = a[i];
    26                     a[i] = a[index];
    27                     a[index] = temp;
    28                 }              
    29 
    30             }
    31 
    32 
    33             for (int i = 0; i < a.Length; i++)
    34             {
    35                 Console.Write("{0}	", a[i]);
    36             }
    37             Console.ReadLine();

     简单说明下原理

    {1,5,3,7,8,4,9};  按从大到小排序 
    i=0 找到最大的下标6(9) a[0]与a[6]交换 数组变为 {9,5,3,7,8,4,1}
    i=1 找到剩余数中最大值下标 4(8) a[1]与a[4]交换 数组变为{9,8,3,7,5,4,1}
    依次类推...

    快速排序: 在数组中取任意一个数(一般取a[0])将数组比这个数大的放一边,小的放另一边,然后 把数组大的一边和小的一边又按前面的重复,直到每一边只剩一个数。
    快速排序用到了递归(方法自己调用自己),如有不懂可以查资料
    代码:

      

     1 int []a={1,5,3,7,8,4,9};
     2 
     3 
     4             for (int i = 0; i < a.Length; i++)
     5             {
     6                 Console.Write("{0}	", a[i]);
     7             }
     8 
     9             bool IsAsc = true;  // true 升序 ,false 降序
    10             Console.WriteLine();
    11             Order(0, a.Length-1, a,IsAsc); //第一划分是整个数组所以是0-a.length-1
    12 
    13             for (int i = 0; i < a.Length; i++)
    14             {
    15                 Console.Write("{0}	", a[i]);
    16             }
    17             Console.ReadLine();
    18   

    上面是main 方法体 ,下面是Order方法

     1   void Order(int left,int right,int []a,bool  IsAsc)
     2         {
     3 
     4             if (left >=right) return;  //左边的下标不能大于右边的下标        
     5             int low = left;  //记录左边下标
     6             int hight = right; //记录右边下标
     7             int Val = a[left]; //默认取左边的第一值,第一次是a[0]
     8             while (left < right)
     9             {
    10                 while (left < right && (IsAsc ? a[right] > Val : a[right]<Val))
    11                 {
    12                     right--;
    13                 }
    14 
    15                 if (left < right)
    16                 {
    17                     a[left] = a[right];
    18                     left++;
    19 
    20                 }
    21 
    22                 while (left < right && (IsAsc ? a[left] < Val : a[left]>Val))
    23                 {
    24                     left++;
    25                 }
    26 
    27                 if (left < right)
    28                 {
    29                     a[right] = a[left];
    30                     right--;
    31 
    32                 }
    33             }
    34 
    35             if (left == right)
    36             {
    37                 a[left] = Val;
    38             }
    39              //以上将下标 left到right 之间的数 按 Val 分成三块:下标[low到(left-1)]{ 都大(小)于a[left]} ,[left(right)],[right+1,hight]{ 都小(大)于 a[left]}
    40             //上面执行完 left是等于right的
    41             firstOrder(low, right - 1, a,IsAsc); //重新比较第一块
    42             firstOrder(left + 1, hight, a,IsAsc);//重新比较第三块
    43         
    44         }

    以上都是个人理解,如有错误深感抱歉。



  • 相关阅读:
    扩展springMVC
    SpringBoot推荐的Thymeleaf
    springboot使用注解添加组件
    @PropertySource 加载指定的配置文件
    读取yml配置文件中的值
    媒体查询
    若是前台接收的数据为null的不进行传递
    DATA时间:若是数据库存储的为毫秒,而前台需要的是秒,下面介绍一个工具类:
    表单验证
    Redis集群总结
  • 原文地址:https://www.cnblogs.com/startlearn/p/3691325.html
Copyright © 2011-2022 走看看