首页 > 其他分享 >CSharp: Sort

CSharp: Sort

时间:2023-01-27 17:55:26浏览次数:43  
标签:Sort int System static CSharp using array

 

Bubble Sort冒泡排序
Selection Sort选择排序
Insertion Sort插入排序
Quick Sort快速排序
Shell Sort 希尔排序
Merge Sort 归并排序
Heap Sort 堆排序
Bucket Sort 桶排序又叫箱排序
Radix Sort 基数排序
Count Sort 计数排序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// 冒泡排序 Bubble Sort 
    /// </summary>
    public static class BubbleSort
    {

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        public static void Sort<T>(T[] array) where T : IComparable
        {
            for (int i = 0; i < array.Length; i++)
            {
                bool isAnyChange = false;
                for (int j = 0; j < array.Length - 1; j++)
                {
                    if (array[j].CompareTo(array[j + 1]) > 0)
                    {
                        isAnyChange = true;
                        Swap(array, j, j + 1);
                    }
                }

                if (!isAnyChange)
                {
                    break;
                }
            }
        }
        /// <summary>
        /// 泛型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="first"></param>
        /// <param name="second"></param>
        private static void Swap<T>(T[] array, int first, int second)
        {
            T temp = array[first];
            array[first] = array[second];
            array[second] = temp;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// Bucket Sort 桶排序又叫箱排序
    /// </summary>
    public class BucketSort
    {
        //Bucket sort breaks a list down into sub-lists, you can then use another algo to sort the sub-lists
        //Bucketsort isn't a good choice if you don't know the range or distribution of the data
        //Bucket Sort time complexity
        //Average case: O(n+k) - k being the number of buckets that were created
        //Worst case: O(N^2)

        //In this case, we will focus on building an algorithm that uses bucketsort to sort an array of integers between 1 and 99
        //we will also assume that the integers in the passed array are evenly distributed
        public static List<int> bucketSort(params int[] x)
        {
            List<int> result = new List<int>();

            //Determine how many buckets you want to create, in this case, the 10 buckets will each contain a range of 10
            //1-10, 11-20, 21-30, etc. since the passed array is between 1 and 99
            int numOfBuckets = 10;

            //Create buckets
            List<int>[] buckets = new List<int>[numOfBuckets];
            for (int i = 0; i < numOfBuckets; i++)
                buckets[i] = new List<int>();

            //Iterate through the passed array and add each integer to the appropriate bucket
            for (int i = 0; i < x.Length; i++)
            {
                int buckitChoice = (x[i] / numOfBuckets);
                buckets[buckitChoice].Add(x[i]);
            }

            //Sort each bucket and add it to the result List
            //Each sublist is sorted using Bubblesort, but you could substitute any sorting algo you would like
            for (int i = 0; i < numOfBuckets; i++)
            {
                int[] temp = BubbleSortList(buckets[i]);
                result.AddRange(temp);
            }
            return result;
        }

        //Bubblesort w/ ListInput
        /// <summary>
        /// 
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static int[] BubbleSortList(List<int> input)
        {
            for (int i = 0; i < input.Count; i++)
            {
                for (int j = 0; j < input.Count; j++)
                {
                    if (input[i] < input[j])
                    {
                        int temp = input[i];
                        input[i] = input[j];
                        input[j] = temp;
                    }
                }
            }
            return input.ToArray();
        }
        ////Call in Program.cs to test
        //int[] x = new int[] { 99, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 1 };
        //List<int> sorted = Bucket_Sort.BucketSort(x);
        //foreach (int i in sorted)
        //    Console.WriteLine(i);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="data"></param>
        /// <param name="bucketCount"></param>
        public static void DBBucketSort(double[] data, int bucketCount)
        {
            var buckets = new List<double>[bucketCount];
            for (int i = 0; i < bucketCount; i++)
                buckets[i] = new List<double>(data.Length / bucketCount);

            var min = double.MaxValue;
            var max = -double.MaxValue;

            for (int i = 0; i < data.Length; i++)
            {
                min = Math.Min(min, data[i]);
                max = Math.Max(max, data[i]);
            }

            for (int i = 0; i < data.Length; i++)
            {
                var idx = Math.Min(bucketCount - 1, (int)(bucketCount * (data[i] - min) / (max - min)));
                buckets[idx].Add(data[i]);
            }

            Parallel.For(0, bucketCount, i => buckets[i].Sort());

            var index = 0;
            for (var i = 0; i < bucketCount; i++)
                for (var j = 0; j < buckets[i].Count; j++)
                    data[index++] = buckets[i][j];
        }

    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// Count Sort 计数排序
    /// </summary>
    public class CountSort
    {


        /// <summary>
        /// 
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public int[] CountingSort(int[] array)
        {
            var size = array.Length;
            var maxElement = GetMaxVal(array, size);
            var occurrences = new int[maxElement + 1];

            for (int i = 0; i < maxElement + 1; i++)
            {
                occurrences[i] = 0;
            }
            for (int i = 0; i < size; i++)
            {
                occurrences[array[i]]++;
            }
            for (int i = 0, j = 0; i <= maxElement; i++)
            {
                while (occurrences[i] > 0)
                {
                    array[j] = i;
                    j++;
                    occurrences[i]--;
                }
            }
            return array;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="array"></param>
        /// <param name="size"></param>
        /// <returns></returns>
        public static int GetMaxVal(int[] array, int size)
        {
            var maxVal = array[0];
            for (int i = 1; i < size; i++)
                if (array[i] > maxVal)
                    maxVal = array[i];
            return maxVal;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="arr"></param>
        /// <exception cref="IndexOutOfRangeException"></exception>
        public static void duCountSort(int[] arr)
        {
            int max = -1;
            foreach (int i in arr)
            {
                if (i < 0)
                {
                    throw new IndexOutOfRangeException(" < 0 ");
                }
                max = Math.Max(max, i);
            }

            int n = arr.Length;

            // The output character array that will have sorted arr
            int[] output = new int[n];

            // Create a count array to store count of inidividul
            // characters and initialize count array as 0
            int[] count = new int[max + 1];
            for (int i = 0; i <= max; ++i)
                count[i] = 0;

            // store count of each character
            foreach (int i in arr)
                count[i]++;

            // Change count[i] so that count[i] now contains actual
            // position of this character in output array
            for (int i = 1; i <= max; ++i)
                count[i] += count[i - 1];

            // Build the output character array
            for (int i = 0; i < n; ++i)
            {
                output[count[arr[i]] - 1] = arr[i];
                count[arr[i]]--;
            }

            // Copy the output array to arr, so that arr now
            // contains sorted characters
            for (int i = 0; i < n; ++i)
                arr[i] = output[i];
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="arr"></param>
        public static void countsortstr(char[] arr)
        {
            int n = arr.Length;

            // The output character array that
            // will have sorted arr
            char[] output = new char[n];

            // Create a count array to store
            // count of individual characters
            // and initialize count array as 0
            int[] count = new int[256];

            for (int i = 0; i < 256; ++i)
                count[i] = 0;

            // store count of each character
            for (int i = 0; i < n; ++i)
                ++count[arr[i]];

            // Change count[i] so that count[i]
            // now contains actual position of
            // this character in output array
            for (int i = 1; i <= 255; ++i)
                count[i] += count[i - 1];

            // Build the output character array
            // To make it stable we are operating in reverse
            // order.
            for (int i = n - 1; i >= 0; i--)
            {
                output[count[arr[i]] - 1] = arr[i];
                --count[arr[i]];
            }

            // Copy the output array to arr, so
            // that arr now contains sorted
            // characters
            for (int i = 0; i < n; ++i)
                arr[i] = output[i];
        }

    }


}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    ///Heap Sort 堆排序
    ///
    /// </summary>
    public class HeapSort
    {

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        public static void heapSort<T>(T[] array) where T : IComparable<T>
        {
            int heapSize = array.Length;

            buildMaxHeap(array);

            for (int i = heapSize - 1; i >= 1; i--)
            {
                swap(array, i, 0);
                heapSize--;
                sink(array, heapSize, 0);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        private static void buildMaxHeap<T>(T[] array) where T : IComparable<T>
        {
            int heapSize = array.Length;

            for (int i = (heapSize / 2) - 1; i >= 0; i--)
            {
                sink(array, heapSize, i);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="heapSize"></param>
        /// <param name="toSinkPos"></param>
        private static void sink<T>(T[] array, int heapSize, int toSinkPos) where T : IComparable<T>
        {
            if (getLeftKidPos(toSinkPos) >= heapSize)
            {
                // No left kid => no kid at all
                return;
            }


            int largestKidPos;
            bool leftIsLargest;

            if (getRightKidPos(toSinkPos) >= heapSize || array[getRightKidPos(toSinkPos)].CompareTo(array[getLeftKidPos(toSinkPos)]) < 0)
            {
                largestKidPos = getLeftKidPos(toSinkPos);
                leftIsLargest = true;
            }
            else
            {
                largestKidPos = getRightKidPos(toSinkPos);
                leftIsLargest = false;
            }



            if (array[largestKidPos].CompareTo(array[toSinkPos]) > 0)
            {
                swap(array, toSinkPos, largestKidPos);

                if (leftIsLargest)
                {
                    sink(array, heapSize, getLeftKidPos(toSinkPos));

                }
                else
                {
                    sink(array, heapSize, getRightKidPos(toSinkPos));
                }
            }

        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="pos0"></param>
        /// <param name="pos1"></param>
        private static void swap<T>(T[] array, int pos0, int pos1)
        {
            T tmpVal = array[pos0];
            array[pos0] = array[pos1];
            array[pos1] = tmpVal;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="parentPos"></param>
        /// <returns></returns>
        private static int getLeftKidPos(int parentPos)
        {
            return (2 * (parentPos + 1)) - 1;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="parentPos"></param>
        /// <returns></returns>
        private static int getRightKidPos(int parentPos)
        {
            return 2 * (parentPos + 1);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        public static void printArray<T>(T[] array)
        {

            foreach (T t in array)
            {
                Console.Write(' ' + t.ToString() + ' ');
            }

        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// 插入排序Insertion Sort
    /// </summary>
    public static class InsertionSort
    {

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        public static void Sort<T>(T[] array) where T : IComparable
        {
            for (int i = 1; i < array.Length; i++)
            {
                int j = i;
                while (j > 0 && array[j].CompareTo(array[j - 1]) < 0)
                {
                    Swap(array, j, j - 1);
                    j--;
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="first"></param>
        /// <param name="second"></param>
        private static void Swap<T>(T[] array, int first, int second)
        {
            T temp = array[first];
            array[first] = array[second];
            array[second] = temp;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// Merge Sort 归并排序
    /// </summary>
    public class MergeSort
    {

        /// <summary>
        /// 
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public static int[] mergeSort(int[] array)
        {
            int[] left;
            int[] right;
            int[] result = new int[array.Length];
            //As this is a recursive algorithm, we need to have a base case to 
            //avoid an infinite recursion and therfore a stackoverflow
            if (array.Length <= 1)
                return array;
            // The exact midpoint of our array  
            int midPoint = array.Length / 2;
            //Will represent our 'left' array
            left = new int[midPoint];

            //if array has an even number of elements, the left and right array will have the same number of 
            //elements
            if (array.Length % 2 == 0)
                right = new int[midPoint];
            //if array has an odd number of elements, the right array will have one more element than left
            else
                right = new int[midPoint + 1];
            //populate left array
            for (int i = 0; i < midPoint; i++)
                left[i] = array[i];
            //populate right array   
            int x = 0;
            //We start our index from the midpoint, as we have already populated the left array from 0 to midpont
            
            for (int i = midPoint; i < array.Length; i++)
            {
                right[x] = array[i];
                x++;
            }
            //Recursively sort the left array
            left = mergeSort(left);
            //Recursively sort the right array
            right = mergeSort(right);
            //Merge our two sorted arrays
            result = merge(left, right);
            return result;
        }

        //This method will be responsible for combining our two sorted arrays into one giant array

        /// <summary>
        /// 
        /// </summary>
        /// <param name="left"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        public static int[] merge(int[] left, int[] right)
        {
            int resultLength = right.Length + left.Length;
            int[] result = new int[resultLength];
            //
            int indexLeft = 0, indexRight = 0, indexResult = 0;
            //while either array still has an element
            while (indexLeft < left.Length || indexRight < right.Length)
            {
                //if both arrays have elements  
                if (indexLeft < left.Length && indexRight < right.Length)
                {
                    //If item on left array is less than item on right array, add that item to the result array 
                    if (left[indexLeft] <= right[indexRight])
                    {
                        result[indexResult] = left[indexLeft];
                        indexLeft++;
                        indexResult++;
                    }
                    // else the item in the right array wll be added to the results array
                    else
                    {
                        result[indexResult] = right[indexRight];
                        indexRight++;
                        indexResult++;
                    }
                }
                //if only the left array still has elements, add all its items to the results array
                else if (indexLeft < left.Length)
                {
                    result[indexResult] = left[indexLeft];
                    indexLeft++;
                    indexResult++;
                }
                //if only the right array still has elements, add all its items to the results array
                else if (indexRight < right.Length)
                {
                    result[indexResult] = right[indexRight];
                    indexRight++;
                    indexResult++;
                }
            }
            return result;
        }

    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// 快捷排序 Quick Sort
    /// </summary>
    public static class QuickSort
    {

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        public static void Sort<T>(T[] array) where T : IComparable
        {
            Sort(array, 0, array.Length - 1);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="lower"></param>
        /// <param name="upper"></param>
        private static void Sort<T>(T[] array, int lower, int upper) where T : IComparable
        {
            if (lower < upper)
            {
                int p = Partition(array, lower, upper);
                Sort(array, lower, p);
                Sort(array, p + 1, upper);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="lower"></param>
        /// <param name="upper"></param>
        /// <returns></returns>
        private static int Partition<T>(T[] array, int lower, int upper) where T : IComparable
        {
            int i = lower;
            int j = upper;
            T pivot = array[lower];
            // T pivot = array[(lower + upper) / 2];
            do
            {
                while (array[i].CompareTo(pivot) < 0) { i++; }
                while (array[j].CompareTo(pivot) > 0) { j--; }
                if (i >= j) { break; }
                Swap(array, i, j);
            }
            while (i <= j);
            return j;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="first"></param>
        /// <param name="second"></param>
        private static void Swap<T>(T[] array, int first, int second)
        {
            T temp = array[first];
            array[first] = array[second];
            array[second] = temp;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// Radix Sort 基数排序
    /// </summary>
    public class RadixSort
    {

        /// <summary>
        /// 
        /// </summary>
        /// <param name="arr"></param>
       public static void radixSort(int[] arr)
        {
            int i, j;
            int[] tmp = new int[arr.Length];
            for (int shift = 31; shift > -1; --shift)
            {
                j = 0;
                for (i = 0; i < arr.Length; ++i)
                {
                    bool move = (arr[i] << shift) >= 0;
                    if (shift == 0 ? !move : move)
                        arr[i - j] = arr[i];
                    else
                        tmp[j++] = arr[i];
                }
                Array.Copy(tmp, 0, arr, arr.Length - j, j);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// 选择排序  Selection Sort
    /// </summary>
    public static class SelectionSort
    {

        /// <summary>
        /// /
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        public static void Sort<T>(T[] array) where T : IComparable
        {
            for (int i = 0; i < array.Length - 1; i++)
            {
                int minIndex = i;
                T minValue = array[i];
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (array[j].CompareTo(minValue) < 0)
                    {
                        minIndex = j;
                        minValue = array[j];
                    }
                }
                Swap(array, i, minIndex);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="first"></param>
        /// <param name="second"></param>
        private static void Swap<T>(T[] array, int first, int second)
        {
            T temp = array[first];
            array[first] = array[second];
            array[second] = temp;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// Shell Sort 希尔排序
    /// </summary>
    public class ShellSort
    {

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        public static void Sort<T>(IList<T> list) where T : IComparable
        {
            int n = list.Count;
            int h = 1;

            while (h < (n >> 1))
            {
                h = (h << 1) + 1;
            }

            while (h >= 1)
            {
                for (int i = h; i < n; i++)
                {
                    int k = i - h;
                    for (int j = i; j >= h && list[j].CompareTo(list[k]) < 0; k -= h)
                    {
                        T temp = list[j];
                        list[j] = list[k];
                        list[k] = temp;
                        j = k;
                    }
                }
                h >>= 1;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="array"></param>
        /// <param name="first"></param>
        /// <param name="second"></param>
        private static void Swap<T>(T[] array, int first, int second)
        {
            T temp = array[first];
            array[first] = array[second];
            array[second] = temp;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="n"></param>
        public  static void IntShellSort(int[] arr, int n)
        {
            int i, j, pos, temp;
            pos = 3;
            while (pos > 0)
            {
                for (i = 0; i < n; i++)
                {
                    j = i;
                    temp = arr[i];
                    while ((j >= pos) && (arr[j - pos] > temp))
                    {
                        arr[j] = arr[j - pos];
                        j = j - pos;
                    }
                    arr[j] = temp;
                }
                if (pos / 2 != 0)
                    pos = pos / 2;
                else if (pos == 1)
                    pos = 0;
                else
                    pos = 1;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        public void InsertionSort<T>(T[] a) where T : IComparable
        {
            for (int i = 0; i < a.Length; i++)
            { // Exchange a[i] with smallest entry in a[i+1...N).
                int min = i;  // index of minimal entr.
                for (int j = i + 1; j < a.Length; j++)
                {
                    if (Less(a[j], a[min]))
                    {
                        min = j;
                    }
                    else if (a.Length < j + 1)
                    {

                        a[j + 1] = a[j];
                        a[j] = a[min];
                    }
                }
                Show(a);
                Exch(a, i, min);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        public void DuShellSort<T>(T[] a) where T : IComparable
        { // Sort a[] into increasing order.
            int N = a.Length;
            int h = 1;
            while (h < N / 3)
            {
                h = 3 * h + 1; // 1, 4, 13, 40, 121, 364, 1093, ..
            }
            while (h >= 1)
            { // h-sort the array.
                for (int i = h; i < N; i++)
                { // Insert a[i] among a[i-h], a[i-2*h], a[i-3*h]... .
                    for (int j = i; j >= h && Less(a[j], a[j - h]); j -= h)
                        Exch(a, j, j - h);
                    Show(a);
                }

                h = h / 3;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        public void SelectionSort<T>(T[] a) where T : IComparable
        { // Sort a[] into increasing order.
            int n = a.Length;  // array length
            for (int i = 0; i < n; i++)
            { // Exchange a[i] with smallest entry in a[i+1...N).
                int min = i;  // index of minimal entr.
                for (int j = i + 1; j < n; j++)
                    if (Less(a[j], a[min])) min = j;
                Exch(a, i, min);
                Show(a);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        /// <param name="i"></param>
        /// <param name="j"></param>
        private static void Exch<T>(T[] a, int i, int j) where T : IComparable
        {
            T t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        public void Show<T>(T[] a) where T : IComparable
        {            // Print the array, on a single line.
            foreach (T t in a)
            {
                Console.Write(t + " ");
            }
            Console.WriteLine();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="v"></param>
        /// <param name="w"></param>
        /// <returns></returns>
        private static bool Less(IComparable v, IComparable w)
        {
            return v.CompareTo(w) < 0;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        public bool IsSorted(IComparable[] a)
        { // Test whether the array entries are in order.
            for (int i = 1; i < a.Length; i++)
                if (Less(a[i], a[i - 1])) return false;
            return true;
        }


    }
}

 

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace CSharpDataStructuresAlgorithms.SortingAlgorithms
{

    /// <summary>
    /// Bubble Sort冒泡排序
    /// Selection Sort选择排序
    ///Insertion Sort插入排序
    /// Quick Sort快速排序
    ///Shell Sort 希尔排序
    /// Merge Sort 归并排序
    ///Heap Sort 堆排序
    ///Bucket Sort 桶排序又叫箱排序
    ///Radix Sort 基数排序
    ///Count Sort 计数排序

    ///Bidirectional Bubble Sort
    ///Bubble Sort
    /// Bucket Sort
    /// Comb Sort
    /// Cycle Sort
    /// Gnome Sort
    /// Heap Sort
    ///Insertion Sort
    ///Merge Sort
    ///Odd-Even Sort
    /// Pigeonhole Sort
    /// Quick Sort
    ///Quick Sort with Bubble Sort
    /// Selection Sort
    /// Shell Sort
    /// </summary>
    public class SortingAlgorithmsExecute
    {

        /// <summary>
        ///  选择排序  Selection Sort
        /// </summary>
        public static void SelectionTest()
        {
            int[] integerValues = { -11, 12, -42, 0, 1, 90, 68, 6, -9 };
            SelectionSort.Sort(integerValues);
            Console.WriteLine(string.Join(" | ", integerValues));

            float[] floatValues = { -11.2f, 12.56f, -42.59f, 0.0f, 1.1f, 90.9f, 68.68f, 6.1f, -9.8f };
            SelectionSort.Sort(floatValues);
            Console.WriteLine(string.Join(" | ", floatValues));

            string[] stringValues = { "Mary", "Marcin", "Ann", "GeovinDu", "George", "Nicole","涂聚文","江志文","刘慧" };
            SelectionSort.Sort(stringValues);
            Console.WriteLine(string.Join(" | ", stringValues));
        }
        /// <summary>
        /// 插入排序Insertion Sort
        /// </summary>
        public static void InsertionTest()
        {
            int[] integerValues = { -11, 12, -42, 0, 1, 90, 68, 6, -9 };
            InsertionSort.Sort(integerValues);
            Console.WriteLine(string.Join(" | ", integerValues));

            float[] floatValues = { -11.2f, 12.56f, -42.59f, 0.0f, 1.1f, 90.9f, 68.68f, 6.1f, -9.8f };
            InsertionSort.Sort(floatValues);
            Console.WriteLine(string.Join(" | ", floatValues));

            string[] stringValues = { "Mary", "Marcin", "Ann", "James", "GeovinDu", "Nicole", "涂聚文", "江志文", "刘慧" };
            InsertionSort.Sort(stringValues);
            Console.WriteLine(string.Join(" | ", stringValues));
        }
        /// <summary>
        ///  冒泡排序 Bubble Sort 
        /// </summary>
        public static void BubbleTest()
        {
            int[] integerValues = { -11, 12, -42, 0, 1, 90, 68, 6, -9 };
            BubbleSort.Sort(integerValues);
            Console.WriteLine(string.Join(" | ", integerValues));

            float[] floatValues = { -11.2f, 12.56f, -42.59f, 0.0f, 1.1f, 90.9f, 68.68f, 6.1f, -9.8f };
            BubbleSort.Sort(floatValues);
            Console.WriteLine(string.Join(" | ", floatValues));

            string[] stringValues = { "Mary", "Marcin", "Ann", "James", "GeovinDu", "Nicole", "涂聚文", "江志文", "刘慧" };
            BubbleSort.Sort(stringValues);
            Console.WriteLine(string.Join(" | ", stringValues));
        }
        /// <summary>
        /// 快捷排序 Quick Sort
        /// </summary>
        public static void QuicksortTest()
        {
            int[] integerValues = { -11, 12, -42, 0, 1, 90, 68, 6, -9 };
            QuickSort.Sort(integerValues);
            Console.WriteLine(string.Join(" | ", integerValues));

            float[] floatValues = { -11.2f, 12.56f, -42.59f, 0.0f, 1.1f, 90.9f, 68.68f, 6.1f, -9.8f };
            QuickSort.Sort(floatValues);
            Console.WriteLine(string.Join(" | ", floatValues));

            string[] stringValues = { "Mary", "Marcin", "Ann", "James", "GeovinDu", "Nicole", "涂聚文", "江志文", "刘慧" };
            QuickSort.Sort(stringValues);
            Console.WriteLine(string.Join(" | ", stringValues));
        }
        /// <summary>
        /// 希尔排序
        /// </summary>
        public static void ShellSortTest()
        {

            int[] arr = new int[] { 56, 12, 99, 32, 1, 95, 25, 5, 100, 84 };
            int n = arr.Length;
            int i;
            Console.WriteLine("Shell Sort");
            Console.Write("Initial array is: ");
            for (i = 0; i < n; i++)
            {
                Console.Write(arr[i] + " ");
            }
            ShellSort.IntShellSort(arr, n);
            Console.Write("Sorted Array is: ");
            for (i = 0; i < n; i++)
            {
                Console.Write(arr[i] + " ");
            }

        }
        /// <summary>
        /// 归并排序
        /// </summary>
        public static void MergeSortTest()
        {

            int[] mykeys = new int[] { 2, 5, -4, 11, 0, 18, 22, 67, 51, 6 };
            int[] myvalues = MergeSort.mergeSort(mykeys);
            int n=myvalues.Length;
            int i;
            for (i = 0; i < n; i++)
            {
                Console.Write(myvalues[i] + " ");
            }

        }
        /// <summary>
        /// 堆排序
        /// </summary>
        public static void HeapSortTest()
        {
            int[] mykeys = new int[] { 2, 5, -4, 11, 0, 18, 22, 67, 51, 6 };

            double[] doublemykeys = new double[] {2.22, 0.5, 2.7, -1.0, 11.2};

            string[] stringmykeys = new string[] {"Red", "White", "Black", "geovindu", "Orange", "涂聚文", "江志文", "刘慧" };

            Console.WriteLine("\nOriginal Array Elements :");
            HeapSort.printArray(mykeys);
            HeapSort.heapSort(mykeys);
            Console.WriteLine("\n\nSorted Array Elements :");
            HeapSort.printArray(mykeys);
            Console.WriteLine("\n");
            HeapSort.heapSort(doublemykeys);
            Console.WriteLine("\n\nSorted Array Elements :");
            HeapSort.printArray(doublemykeys);
            Console.WriteLine("\n");
            HeapSort.heapSort(stringmykeys);
            Console.WriteLine("\n\nSorted Array Elements :");
            HeapSort.printArray(stringmykeys);



        }
        /// <summary>
        /// 桶排序又叫箱排序
        /// </summary>
        public static void BucketSortTest()
        {
            int[] x = new int[] { 99, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 1 };
            List<int> sorted = BucketSort.bucketSort(x);
            foreach (int i in sorted)
                Console.WriteLine(" " + i);
        }
        /// <summary>
        /// 基数排序
        /// </summary>
        public static void RadixSortTest()
        {
            int[] arr = new int[] { 2, 5, -4, 11, 0, 18, 22, 67, 51, 6 };
            Console.WriteLine("\nOriginal array : ");
            foreach (var item in arr)
            {
                Console.Write(" " + item);
            }

            RadixSort.radixSort(arr);
            Console.WriteLine("\nSorted array : ");
            foreach (var item in arr)
            {
                Console.Write(" " + item);
            }
            Console.WriteLine("\n");
        }
        /// <summary>
        /// 计数排序
        /// </summary>
        public static void CountSortTest()
        {
            char[] arr = { 'g', 'e', 'o', 'v', 'i', 'n', 'd',
                       'u', 'l', 'o', 'v', 'e', 'I' };

            CountSort.countsortstr(arr);

            Console.Write("Sorted character array is ");
            for (int i = 0; i < arr.Length; ++i)
                Console.Write(" " + arr[i]);

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="header"></param>
        /// <param name="addLine"></param>
        public static void WriteHeader(string header, bool addLine = true)
        {
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine((addLine ? Environment.NewLine : string.Empty) + header);
            Console.ForegroundColor = ConsoleColor.Gray;
        }
    }
}

  

 

调用:

 

//geovindu
SortingAlgorithmsExecute.WriteHeader("Selection Sort 查找排序:", false);
SortingAlgorithmsExecute.SelectionTest();

SortingAlgorithmsExecute.WriteHeader("Insertion Sort 插入排序:");
SortingAlgorithmsExecute.InsertionTest();

SortingAlgorithmsExecute.WriteHeader("Bubble Sort 冒泡排序");
SortingAlgorithmsExecute.BubbleTest();

SortingAlgorithmsExecute.WriteHeader("Quick Sort 快速排序");
SortingAlgorithmsExecute.QuicksortTest();

SortingAlgorithmsExecute.WriteHeader("Merge Sort 归并排序");
SortingAlgorithmsExecute.MergeSortTest();

SortingAlgorithmsExecute.WriteHeader("Bucket Sort 桶排序又叫箱排序");
SortingAlgorithmsExecute.BucketSortTest();

SortingAlgorithmsExecute.WriteHeader("Shell Sort 希尔排序");
SortingAlgorithmsExecute.ShellSortTest();

SortingAlgorithmsExecute.WriteHeader("Heap Sort 堆排序");
SortingAlgorithmsExecute.HeapSortTest();

SortingAlgorithmsExecute.WriteHeader("Radix Sort 基数排序");
SortingAlgorithmsExecute.RadixSortTest();

SortingAlgorithmsExecute.WriteHeader("Count Sort 计数排序");
SortingAlgorithmsExecute.CountSortTest();

  

 

输出:

Selection Sort 查找排序:
-42 | -11 | -9 | 0 | 1 | 6 | 12 | 68 | 90
-42.59 | -11.2 | -9.8 | 0 | 1.1 | 6.1 | 12.56 | 68.68 | 90.9
江志文 | 刘慧 | 涂聚文 | Ann | George | GeovinDu | Marcin | Mary | Nicole

Insertion Sort 插入排序:
-42 | -11 | -9 | 0 | 1 | 6 | 12 | 68 | 90
-42.59 | -11.2 | -9.8 | 0 | 1.1 | 6.1 | 12.56 | 68.68 | 90.9
江志文 | 刘慧 | 涂聚文 | Ann | GeovinDu | James | Marcin | Mary | Nicole

Bubble Sort 冒泡排序
-42 | -11 | -9 | 0 | 1 | 6 | 12 | 68 | 90
-42.59 | -11.2 | -9.8 | 0 | 1.1 | 6.1 | 12.56 | 68.68 | 90.9
江志文 | 刘慧 | 涂聚文 | Ann | GeovinDu | James | Marcin | Mary | Nicole

Quick Sort 快速排序
-42 | -11 | -9 | 0 | 1 | 6 | 12 | 68 | 90
-42.59 | -11.2 | -9.8 | 0 | 1.1 | 6.1 | 12.56 | 68.68 | 90.9
江志文 | 刘慧 | 涂聚文 | Ann | GeovinDu | James | Marcin | Mary | Nicole

Merge Sort 归并排序
-4 0 2 5 6 11 18 22 51 67
Bucket Sort 桶排序又叫箱排序
 1
 5
 10
 15
 20
 25
 30
 35
 40
 45
 50
 55
 60
 65
 70
 75
 80
 85
 90
 95
 99

Shell Sort 希尔排序
Shell Sort
Initial array is: 56 12 99 32 1 95 25 5 100 84 Sorted Array is: 1 5 12 25 32 56 84 95 99 100
Heap Sort 堆排序

Original Array Elements :
 2  5  -4  11  0  18  22  67  51  6

Sorted Array Elements :
 -4  0  2  5  6  11  18  22  51  67



Sorted Array Elements :
 -1  0.5  2.22  2.7  11.2



Sorted Array Elements :
 江志文  刘慧  涂聚文  Black  geovindu  Orange  Red  White
Radix Sort 基数排序

Original array :
 2 5 -4 11 0 18 22 67 51 6
Sorted array :
 -4 0 2 5 6 11 18 22 51 67


Count Sort 计数排序
Sorted character array is  I d e e g i l n o o u v v

  

from: 

https://www.geeksforgeeks.org/counting-sort/
https://github.com/DragonSpit/HPCsharp
https://rosettacode.org/wiki/Sorting_algorithms/Shell_sort
https://codereview.stackexchange.com/questions/68679/shell-sort-seems-inefficient
https://www.codeproject.com/articles/132757/visualization-and-comparison-of-sorting-algorithms
https://www.w3resource.com/csharp-exercises/searching-and-sorting-algorithm/searching-and-sorting-algorithm-exercise-5.php
https://www.w3resource.com/csharp-exercises/searching-and-sorting-algorithm/searching-and-sorting-algorithm-exercise-1.php

标签:Sort,int,System,static,CSharp,using,array
From: https://www.cnblogs.com/geovindu/p/17069114.html

相关文章

  • CSharp: Collection
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceCSharpDataStructuresAlgorithms......
  • Min Max Sort
    题目链接题目描述:Youaregivenapermutation\(p\)oflength\(n\)(apermutationoflength\(n\)isanarrayoflength\(n\)inwhicheachintegerfrom\(1\)......
  • CSharp: Add,Edit,Del,Select in donet using Entity Framework
     usingSystem;usingSystem.Collections.Generic;usingSystem.Data.Entity;usingSystem.Linq;usingSystem.Runtime.Remoting.Contexts;usingSystem.Text;usi......
  • C语言库函数qsort的使用
    前言qsort是C语言的库函数,使用前需包含头文件#include<stdlib.h>,函数原型是voidqsort(void*base,size_tnum,size_twidth,int(__cdecl*compare)(constvoid*......
  • CSharp: emojione
     ///<summary>///mysql数据库用编码类型utf8mb4///向sqlserver数据库插入emoji表情包///插入emoji的数据时,值value需要......
  • CSharp: SOAP,WSDL
     引用服务有修改,点右键更新 Web.config<?xmlversion="1.0"encoding="utf-8"?><configuration><configSections><sectionname="microsoft.web.services3......
  • CSharp: Lazy Load Pattern in donet core 6
     usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceGeovin.Du.DuLazyLoad.DuGhost......
  • JS数组对象 | 中文按照首字母排序sort()、localeCompare()
    一、数组//根据中文の首字母排序letarr=['上海','北京','广州','深圳']arr.sort((a,b)=>a.localeCompare(b))console.log(arr)//数组sort()方法是会改变原数组的,可......
  • Apache IoTDB C# SDK Apache-IoTDB-Client-CSharp
    最近今天写了IoTDB的三篇相关文章,完成了安装部署和客户端连接:WindowsServer上部署IoTDB集群DBeaver连接IoTDBDriver将IoTDB注册为Windows服务TsFile是IoTDB的底层数......
  • CodeForces 1783F Double Sort II
    洛谷传送门CF传送门考虑只有一个排列怎么做。有一个结论是答案为\(n\-\)置换环个数,即每个环都会选择一个点不操作,其他点都操作。接下来考虑两个排列,显然当\(x\)在......