zoukankan      html  css  js  c++  java
  • 排序(C#版)

    1.冒泡排序

    using System;
    using System.Collections.Generic;
    using System.Text;
    /// <summary>
    /// 冒泡排序
    /// </summary>
    public class BubbleSorter
    {
        private static int[] myArray;
        private static int arraySize;

        public static void Sort(int[] a)
        {
            myArray = a;
            arraySize = myArray.Length;
            BubbleSort(myArray);
        }
        /// <summary>
        /// 冒泡算法
        /// </summary>
        /// <param name="myArray"></param>
        public static void BubbleSort(int[] myArray)
        {
            for (int i = 0; i < myArray.Length; i++)//循环的趟数
            {
                for (int j = 0; j < myArray.Length - 1 - i; j++)//每次循环的次数
                {
                    if (myArray[j] > myArray[j + 1])
                    {
                        Swap(ref myArray[j], ref myArray[j + 1]);
                    }
                }
            }
        }
        /// <summary>
        /// 交换
        /// </summary>
        /// <param name="left"></param>
        /// <param name="right"></param>
        private static void Swap(ref int left, ref int right)
        {
            int temp;
            temp = left;
            left = right;
            right = temp;
        }

        public static void Main(string[] args)
        {
            int[] a = new int[] { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
            BubbleSorter.Sort(a);

            for (int i = 0; i < a.Length; i++)
            {
                System.Console.WriteLine(a[i]);
            }
        }
    }

    2.鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序) 

    using System;
    using System.Collections.Generic;
    using System.Text;

    public class CockTailSorter
    {
        private static int[] myArray;
        private static int arraySize;

        public static void Sort(int[] a)
        {
            myArray = a;
            arraySize = myArray.Length;
            CockTailSort(myArray);
        }

        public static void CockTailSort(int[] myArray)
        {
            int low, up, index, i;
            low = 0;
            up = myArray.Length - 1;
            index = low;

            while (up > low)
            {
                for (i = low; i < up; i++)//从上向下扫描
                {
                    if (myArray[i] > myArray[i + 1])
                    {
                        Swap(ref myArray[i], ref myArray[i + 1]);
                        index = i;
                    }
                }

                up = index;//记录最后一个交换的位置
                for (i = up; i > low; i--)//从最后一个交换位置从下往上扫描
                {
                    if (myArray[i] < myArray[i - 1])
                    {
                        Swap(ref myArray[i], ref myArray[i - 1]);
                        index = i;
                    }
                }

                low = index;//记录最后一个交换的位置
            }

        }
        /// <summary>
        /// 交换
        /// </summary>
        /// <param name="left"></param>
        /// <param name="right"></param>
        private static void Swap(ref int left, ref int right)
        {
            int temp;
            temp = left;
            left = right;
            right = temp;
        }

        public static void Main(string[] args)
        {
            int[] a = new int[] { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
            CockTailSorter.Sort(a);

            for (int i = 0; i < a.Length; i++)
            {
                System.Console.WriteLine(a[i]);
            }
        }
    }

    3.选择排序

    using System;
    using System.Collections.Generic;
    using System.Text;
    public class SelectSorter
    {
        private static int[] myArray;
        private static int arraySize;

        public static void Sort(int[] a)
        {
            myArray = a;
            arraySize = myArray.Length;
            SelectSort(myArray);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="myArray"></param>
        public static void SelectSort(int[] myArray)
        {
            int i, j, smallest;
            for (i = 0; i < myArray.Length - 1; i++)//数据起始位置,从0到倒数第二个数据
            {
                smallest = i;//记录最小数据的下标
                for (j = i + 1; j < myArray.Length; j++)
                {
                    if (myArray[j] < myArray[smallest])//在剩下的数据中寻找最小数据
                    {
                        smallest = j;//如果有比它更小的,记录下标
                    }
                }
                Swap(ref myArray[i], ref myArray[smallest]);//将最小数据和未排序的第一个数据交换
            }
        }
        /// <summary>
        /// 交换
        /// </summary>
        /// <param name="left"></param>
        /// <param name="right"></param>
        private static void Swap(ref int left, ref int right)
        {
            int temp;
            temp = left;
            left = right;
            right = temp;
        }

        public static void Main(string[] args)
        {
            int[] a = new int[] { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
            SelectSorter.Sort(a);

            for (int i = 0; i < a.Length; i++)
            {
                System.Console.WriteLine(a[i]);
            }
        }
    }

    4.插入排序

    using System;
    using System.Collections.Generic;
    using System.Text;

    public class InsertSorter
    {
        private static int[] myArray;
        private static int arraySize;

        public static void Sort(int[] a)
        {
            myArray = a;
            arraySize = myArray.Length;
            InsertSort(myArray);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="myArray"></param>
        public static void InsertSort(int[] myArray)
        {
            int i, j, temp;

            for (i = 1; i < myArray.Length; i++)
            {
                temp = myArray[i];//保存当前数据
                j = i - 1;

                //将数据插入有序表中,如果表中的数据比该数据大
                //那么就依次向后移动有序表中的数据,直到找到第一个比它小的数据
                //将它放在那个数据后面

                while (j >= 0 && myArray[j] > temp)
                {
                    myArray[j + 1] = myArray[j];
                    j--;
                }
                myArray[j + 1] = temp;
            }
        }


        public static void Main(string[] args)
        {
            int[] a = new int[] { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
            InsertSorter.Sort(a);

            for (int i = 0; i < a.Length; i++)
            {
                System.Console.WriteLine(a[i]);
            }
        }
    }

    5.希尔排序

    using System;
    using System.Collections.Generic;
    using System.Text;

    public class ShellSorter
    {
        private static int[] myArray;
        private static int arraySize;

        public static void Sort(int[] a)
        {
            myArray = a;
            arraySize = myArray.Length;
            ShellSort(myArray);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="myArray"></param>
        public static void ShellSort(int[] myArray)
        {
            int i, j, increment;
            int temp;

            for (increment = myArray.Length / 2; increment > 0; increment /= 2)
            {
                for (i = increment; i < myArray.Length; i++)
                {
                    temp = myArray[i];
                    for (j = i; j >= increment; j -= increment)
                    {
                        if (temp < myArray[j - increment])
                            myArray[j] = myArray[j - increment];
                        else
                            break;
                    }
                    myArray[j] = temp;
                }
            }
        }


        public static void Main(string[] args)
        {
            int[] a = new int[] { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
            ShellSorter.Sort(a);

            for (int i = 0; i < a.Length; i++)
            {
                System.Console.WriteLine(a[i]);
            }
        }
    }

     6.快速排序

    using System;
    using System.Collections.Generic;
    using System.Text;

    public class QuickSorter
    {
        private static int[] myArray;
        private static int arraySize;

        public static void Sort(int[] a)
        {
            myArray = a;
            arraySize = myArray.Length;
            QuickSort(myArray, 0, myArray.Length - 1);
        }
        /// <summary>
        /// 快速排序算法
        /// </summary>
        /// <param name="myArray"></param>
        public static void QuickSort(int[] myArray, int left, int right)
        {
            int i, j, s;
            if (left < right)
            {
                i = left - 1;
                j = right + 1;
                s = myArray[(i + j) / 2];
                while (true)
                {
                    while (myArray[++i] < s) ;
                    while (myArray[--j] > s) ;
                    if (i >= j)
                        break;
                    Swap(ref myArray[i], ref myArray[j]);
                }
                QuickSort(myArray, left, i - 1);
                QuickSort(myArray, j + 1, right);
            }
        }
        /// <summary>
        /// 交换
        /// </summary>
        /// <param name="left"></param>
        /// <param name="right"></param>
        private static void Swap(ref int left, ref int right)
        {
            int temp;
            temp = left;
            left = right;
            right = temp;
        }

        public static void Main(string[] args)
        {
            int[] a = new int[] { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
            QuickSorter.Sort(a);

            for (int i = 0; i < a.Length; i++)
            {
                System.Console.WriteLine(a[i]);
            }
        }
    }

     7.归并排序

    using System;
    using System.Collections.Generic;
    using System.Text;

    public class MergeSorter
    {
        private static int[] myArray;
        private static int arraySize;

        public static void Sort(int[] a)
        {
            myArray = a;
            arraySize = myArray.Length;
            MergeSort();
        }
        /// <summary>
        /// 利用归并的方法排序数组,首先将序列分割
        /// 然后将数列归并
        /// 时间是O(nlog n)
        /// </summary>
        /// <param name="myArray"></param>
        public static void MergeSort()
        {
            int[] temp = new int[arraySize];
            Msort(temp, 0, arraySize - 1);
        }
        private static void Msort(int[] temp, int left, int right)
        {
            int mid;
            if (right > left)
            {
                mid = (right + left) / 2;
                Msort(temp, left, mid);//分割左边的序列
                Msort(temp, mid + 1, right);//分割右边的序列
                Merge(temp, left, mid + 1, right);//归并序列

            }
        }
        private static void Merge(int[] temp, int left, int mid, int right)
        {
            int i, left_end, num_elements, tmp_pos;
            left_end = mid - 1;
            tmp_pos = left;
            num_elements = right - left + 1;
            while ((left <= left_end) && (mid <= right))
            {
                if (myArray[left] <= myArray[mid])//将左端序列归并到temp数组中
                {
                    temp[tmp_pos] = myArray[left];
                    tmp_pos = tmp_pos + 1;
                    left = left + 1;
                }
                else
                {
                    temp[tmp_pos] = myArray[mid];
                    tmp_pos = tmp_pos + 1;
                    mid = mid + 1;
                }
            }
            while (left <= left_end)//复制左边剩余的数据到temp数组中
            {
                temp[tmp_pos] = myArray[left];
                left = left + 1;
                tmp_pos = tmp_pos + 1;
            }
            while (mid <= right)//复制右边剩余的数据到temp数组中
            {
                temp[tmp_pos] = myArray[mid];
                mid = mid + 1;
                tmp_pos = tmp_pos + 1;
            }

            for (i = 0; i < num_elements; i++)
            {
                myArray[right] = temp[right];
                right = right - 1;
            }
        }


        public static void Main(string[] args)
        {
            int[] a = new int[] { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
            MergeSorter.Sort(a);

            for (int i = 0; i < a.Length; i++)
            {
                System.Console.WriteLine(a[i]);
            }
        }
    }

    8.堆排序

    using System;
    using System.Collections.Generic;
    using System.Text;

    public class HeapSorter
    {
        private static int[] myArray;
        private static int arraySize;

        public static void Sort(int[] a)
        {
            myArray = a;
            arraySize = myArray.Length;
            HeapSort();
        }

        public static void HeapSort()
        {
            BuildHeap();//将原始序列建成一个堆
            while (arraySize > 1)
            {
                arraySize--;
                Exchange(0, arraySize);//将最大值放在数组最后
                TraversingHeap(0);//将序列从0到n-1看成一个新的序列,重新建立堆
            }
        }
        private static void BuildHeap()
        {
            for (int vNode = arraySize / 2 - 1; vNode >= 0; vNode--)
            {
                TraversingHeap(vNode);
            }
        }
        //利用向下遍历子节点建立队
        private static void TraversingHeap(int vNode)
        {
            int wNode = 2 * vNode + 1;//结点wNode是节点vNode的第一个子结点
            while (wNode < arraySize)
            {
                if (wNode + 1 < arraySize)//如果结点vNode下面有第二个子结点
                    if (myArray[wNode + 1] > myArray[wNode])
                        wNode++;//将子结点wNode设置成节点vNode下面值最大的子结点
                if (myArray[vNode] >= myArray[wNode])
                    return;
                Exchange(vNode, wNode);//如果不是,就交换节点vNode和结点wNode的值
                vNode = wNode;
                wNode = 2 * vNode + 1;//继续向下找子结点
            }
        }
        private static void Exchange(int i, int j)
        {
            int t = myArray[i];
            myArray[i] = myArray[j];
            myArray[j] = t;
        }

        public static void Main(string[] args)
        {
            int[] a = new int[] { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
            HeapSorter.Sort(a);

            for (int i = 0; i < a.Length; i++)
            {
                System.Console.WriteLine(a[i]);
            }
        }
    }

  • 相关阅读:
    100%解决XP系统asp http500内部错误[转自XX博客]
    .net使用DotNetCharting控件生成报表统计图总结 (转地址)
    关于request取中文字符串变?的解决办法
    Delete删除大批量数据无响应的解决办法
    点击GridView模版列里的按钮取GridView当前被操作行的数据(转载)
    繁體字顯示問題
    寫博客過程中遇到的問題
    box model相關的API
    Buddhism常用術語
    靡不有初鮮克有終
  • 原文地址:https://www.cnblogs.com/CodingPerfectWorld/p/1710405.html
Copyright © 2011-2022 走看看