几种简单的排序算法

直接上代码吧!比简单只是太长时间不怎么写排序算法了,想着没事写写,温故而知新

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 简单排序算法
/// </summary>
public class BubbleSort : MonoBehaviour {
    int[] number0 = new int[10] {5,10,4,8,6,7,44,56,45,11 };

    private void Start()
    {
        int[] b = sort(number0);
        for (int i = 0; i < b.Length; i++)
        {
            Debug.Log(b[i]);
        }
    }

    /// <summary>
    /// 冒泡排序
    /// </summary>
    /// <param name="n"></param>
    /// <returns></returns>
    public int[] sort(int[] n)
    {
        int[] returnnumber = n;
        for (int i = 0; i < n.Length-1; i++)
        {
            for (int j = 0; j < n.Length-1-i; j++)
            {
                if (returnnumber[j]>returnnumber[j+1])
                {
                   int a= returnnumber[j];
                   returnnumber[j] = returnnumber[j+1];
                   returnnumber[j+1] = a;
                }
            }
        }
        return returnnumber;
    }


    /// <summary>
    /// 选择排序 (从数组中找到最小元素和当前比较的元素互换)
    /// </summary>
    /// <returns></returns>
    public int[] SelectionSort(int[] n)
    {
        int[] number=n;
        for (int i = 0; i < number.Length-1; i++)
        {
            int minPos = i;
            for (int j = i; j < number.Length; j++)
            {
                if (number[j]<number[minPos])
                {
                    minPos = j;//找出当前最小元素的位置
                }
            }
            if (number[minPos]!=number[i])//如果最小元素与当前位置的元素不相等则交换位置
            {
                int temp = number[minPos];
                number[minPos] = number[i];
                number[i] = temp;
            }
        }
        return number;
    }

    //由选择排序衍生数来的排序算法   双向选择排序(每次循环,同时选出最大值放在末尾,最小值放在前方)
    /// <summary>
    ///  双向选择排序(每次循环,同时选出最大值放在末尾,最小值放在前方)
    /// </summary>
    /// <param name="n"></param>
    /// <returns></returns>
    public int[] BothwaySelectionSort(int[] n)
    {
        int[] number = n;
        for (int i = 0; i < number.Length/2-1; i++)
        {
            int minpos = i, maxpos = number.Length - i - 1;
            for (int j = i; j < number.Length-i; j++)
            {
                if (number[j]<number[minpos])
                {
                    minpos = j;
                }

                if (number[maxpos]<number[j])
                {
                    maxpos = j;
                }
            }
            if (i!=minpos)
            {
                swap(number,i,minpos);
            }

            if (maxpos!=number.Length-i-1)
            {
                if (maxpos==i)若当前最大值在循环起始位置,则最大值一定在(1)处被交换到了minPos的位置
                {
                    maxpos = minpos;
                }
                swap(number,maxpos,number.Length-i-1);
            }
        }
        return number;
    }

    /// <summary>
    /// 两数互相交换函数
    /// </summary>
    /// <param name="arr"></param>
    /// <param name="a"></param>
    /// <param name="b"></param>
    public static void swap(int[] arr, int a, int b)
    {

        int temp = arr[a];

        arr[a] = arr[b];

        arr[b] = temp;

    }


    /// <summary>
    /// 插入排序算法  (从第二个开始对比插入)
    /// </summary>
    /// <param name="n"></param>
    /// <returns></returns>
    public int[] Insertion(int[] n)
    {
        int pos, temp;
        int[] number = n;
        for (int i = 1; i < number.Length; i++)
        {
            pos = i;
            while (pos!=0&&number[pos]<number[pos-1])
            {
                temp = number[pos];
                number[pos] = number[pos - 1];
                number[pos - 1] = temp;
                pos--;
            }
        }
        return number;
    }


    /// <summary>
    /// 鸡尾酒排序
    /// 鸡尾酒是冒泡排序的升级版,该排序从左往右找出最大值后,再从右往左
    ///找出最小值,类似鸡尾酒搅拌左右循环。在某些情况下,优于冒泡排序,
    ///以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问两次(升序降序各一次 )
    ///次序列就可以完成排序,但如果使用冒泡排序则需要四次。
    /// </summary>
    /// <param name="n"></param>
    public static void CockTailsort(int[] n)
        {

        //依次将最大的数放置到数组末尾,将第二大的数放到倒数第二位...
        int[] number = n;
            bool changed;

            for (int i = 0; i < number.Length / 2; i++)
            {

                changed = false;

                //从前往后,比较相邻两个数,把大的放在后边.之前已放置成功的可以不再参与比较

                for (int j = i; j < number.Length - 1 - i; j++)
                {



                    if (number[j] > number[j + 1])
                    {

                        swap(number, j, j + 1);

                        changed = true;

                    }

                }

                if (!changed)
                {

                    break;

                }

                for (int j = number.Length - 1 - i; j > i; j--)
                {



                    if (number[j] < number[j - 1])
                    {

                        swap(number, j, j - 1);

                        changed = true;

                    }

                }

                if (!changed)
                {

                    break;

                }

            }

        }


 }



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值