C# 十大排序算法

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

namespace 排序汇总
{
    class Program
    {
        //********************主函数*****************
        static void Main(string[] args)
        {
            Console.WriteLine("请输入待排序列个数n");
            int n = int.Parse(Console.ReadLine());
            Console.WriteLine("请分别输入待排序元素");
            int[] Sqlist = new int[n + 1];
            for (int i = 1; i < Sqlist.Length; i++)                          //原排列存储在一维数组里,每种算法中下标均从1开始
            {
                Sqlist[i] = int.Parse(Console.ReadLine());
            }

            Console.WriteLine("请选择排序方法:");
            Console.WriteLine("1、直接插入排序  2、折半插入排序  3、二路插入排序  4、希尔排序  5、快速插入排序");
            Console.WriteLine("6、冒泡排序      7、选择排序      8、堆排序        9、归并排序  10、基数排序算法");

            while (true)
            {
                Console.WriteLine();
                int number = int.Parse(Console.ReadLine());
                Console.WriteLine();
                if (number == 1) zhijiecharupaixu(Sqlist);
                if (number == 2) zhebancharu(Sqlist);
                if (number == 3) erlucharusuanfa(Sqlist);
                if (number == 4) xierpaixu(Sqlist);
                if (number == 5) kuaisucharu(Sqlist, n);
                if (number == 6) maopaopaixu(Sqlist);
                if (number == 7) xuanzepaixu(Sqlist);
                if (number == 8) duipaixu(Sqlist);
                if (number == 9) guibingpaixu(Sqlist);
                if (number == 10) jishupaixu(Sqlist);
                Console.WriteLine("该序列从小到大为:");
                for (int i = 1; i < Sqlist.Length; i++)
                {
                    Console.WriteLine(Sqlist[i]);
                }
            }                            //可循环选择输入
        }

        //***********直接插入算法************
        static void zhijiecharupaixu(int[] Sqlist)
        {
            Console.WriteLine("***********直接插入算法************");
            for (int i = 2; i < Sqlist.Length; i++)
            {
                if (Sqlist[i] < Sqlist[i - 1])
                {
                    Sqlist[0] = Sqlist[i];
                    Sqlist[i] = Sqlist[i - 1];
                    int j;
                    for (j = i - 2; Sqlist[0] < Sqlist[j]; --j)
                    {
                        Sqlist[j + 1] = Sqlist[j];
                    }
                    Sqlist[j + 1] = Sqlist[0];
                }
            }
        }

        //***********折半插入算法************
        static void zhebancharu(int[] Sqlist)
        {
            Console.WriteLine("***********折半插入算法************");
            for (int i = 2; i < Sqlist.Length; i++)
            {
                Sqlist[0] = Sqlist[i];
                int low = 1;
                int high = i - 1;
                int m;
                while (low <= high)
                {
                    m = (low + high) / 2;
                    if (Sqlist[0] < Sqlist[m]) high = m - 1;
                    else low = m + 1;
                }
                int j;
                for (j = i - 1; j >= high + 1; --j) Sqlist[j + 1] = Sqlist[j];
                Sqlist[j + 1] = Sqlist[0];
            }
        }
        //***********二路插入算法************
        static void erlucharusuanfa(int[] Sqlist)
        {
            Console.WriteLine("***********二路插入算法************");
            int[] Sl = new int[Sqlist.Length];
            bidir_insert(Sqlist, Sl, Sqlist.Length);
        }
        static void bidir_insert(int[] source, int[] dest, int len)
        {
            int first, last;
            first = last = 1;
            dest[1] = source[1];
            for (int i = 2; i < len; i++)
            {
                if (dest[last] <= source[i])
                {
                    dest[++last] = source[i];
                }
                else if (dest[first] >= source[i])
                {
                    first = (first - 1 + len) % len;
                    dest[first] = source[i];
                }
                else
                {
                    for (int index = (last - 1 + len) % len; ; index = (index - 1 + len) % len)
                    {
                        if (dest[index] <= source[i])
                        {
                            int mid = last++;
                            while (mid != index)
                            {
                                dest[(mid + 1) % len] = dest[mid];
                                mid = (mid - 1 + len) % len;
                            }
                            dest[(index + 1) % len] = source[i];
                            break;
                        }
                    }
                }
            }
            for (int i = 1; i < len; ++i)
            {
                source[i] = dest[first];
                first = (first + 1) % len;
            }
        }
        //***********希尔排序算法************
        static void xierpaixu(int[] Sqlist)
        {
            Console.WriteLine("***********希尔排序算法************");
            int[] dlta = new int[5];
            dlta[0] = 9;
            for (int j = 1; j < 5; j++)
            {
                dlta[j] = dlta[j - 1] - 2;
            }

            for (int i = 0; i < 5; i++)
                Shellinsert(Sqlist, dlta[i]);
        }
        static void Shellinsert(int[] sqlist, int dk)
        {
            for (int i = dk + 1; i < sqlist.Length; ++i)
            {
                if (sqlist[i] < sqlist[i - dk])
                {
                    sqlist[0] = sqlist[i];
                    int j;
                    for (j = i - dk; j > 0 && sqlist[0] < sqlist[j]; j -= dk)
                    {
                        sqlist[j + dk] = sqlist[j];
                    }
                    sqlist[j + dk] = sqlist[0];
                }
            }

        }
        //***********快速排序算法************
        static void kuaisucharu(int[] Sqlist, int n)
        {
            Console.WriteLine("***********快速排序算法************");
            Qsort(Sqlist, 1, n);
        }
        static int Partition(int[] sqlist, int low, int high)
        {
            sqlist[0] = sqlist[low];
            int pivotkey = sqlist[low];
            while (low < high)
            {
                while (low < high && sqlist[high] >= pivotkey) --high;
                sqlist[low] = sqlist[high];
                while (low < high && sqlist[low] <= pivotkey) ++low;
                sqlist[high] = sqlist[low];
            }
            sqlist[low] = sqlist[0];
            return low;
        }
        static void Qsort(int[] sqlist, int low, int high)
        {
            int pivotkey;
            if (low < high)
            {
                pivotkey = Partition(sqlist, low, high);
                Qsort(sqlist, low, pivotkey - 1);
                Qsort(sqlist, pivotkey + 1, high);
            }
        }
        //***********冒泡排序算法************
        static void maopaopaixu(int[] Sqlist)
        {
            Console.WriteLine("***********冒泡排序算法************");
            for (int i = 1; i < Sqlist.Length - 1; i++)
            {
                int m;
                for (int j = 1; j < Sqlist.Length - i; j++)
                {
                    if (Sqlist[j] > Sqlist[j + 1])
                    {
                        m = Sqlist[j + 1];
                        Sqlist[j + 1] = Sqlist[j];
                        Sqlist[j] = m;
                    }
                }
            }
        }
        //***********选择排序算法************
        static void xuanzepaixu(int[] Sqlist)
        {
            Console.WriteLine("***********选择排序算法************");
            for (int i = 1; i < Sqlist.Length - 1; i++)
            {
                int min = i;
                int h;
                for (int j = i + 1; j < Sqlist.Length; j++)
                {
                    if (Sqlist[j] < Sqlist[min])
                    {
                        min = j;
                    }
                }
                h = Sqlist[i];
                Sqlist[i] = Sqlist[min];
                Sqlist[min] = h;
            }
        }
        //***********堆排序算法************
        static void duipaixu(int[] Sqlist)
        {
            Console.WriteLine("***********堆排序算法************");
            Heapsort(Sqlist);
        }
        static void HeapAdjust(int[] sqlist, int s, int m)
        {
            int rc = sqlist[s];
            for (int j = 2 * s; j <= m; j *= 2)
            {
                if (j < m && sqlist[j] < sqlist[j + 1]) ++j;
                if (rc >= sqlist[j]) break;
                sqlist[s] = sqlist[j];
                s = j;
            }
            sqlist[s] = rc;
        }
        static void Heapsort(int[] sqlist)
        {
            int m;
            for (int i = (sqlist.Length - 1) / 2; i > 0; --i)
                HeapAdjust(sqlist, i, sqlist.Length - 1);
            for (int i = sqlist.Length - 1; i > 1; --i)
            {
                m = sqlist[1];
                sqlist[1] = sqlist[i];
                sqlist[i] = m;
                HeapAdjust(sqlist, 1, i - 1);
            }
        }
        //***********归并排序算法************
        static void guibingpaixu(int[] Sqlist)
        {
            Console.WriteLine("***********归并排序算法************");
            Msort(Sqlist, Sqlist, 1, Sqlist.Length - 1);
        }
        static void Merge(int[] SR, int[] TR, int i, int m, int n)
        {
            int j, k;
            for (j = m + 1, k = i; i <= m && j <= n; ++k)
            {
                if (SR[i] <= SR[j]) TR[k] = SR[i++];
                else TR[k] = SR[j++];
            }
            if (i <= m)
            {
                for (; i <= m; i++, k++)
                    TR[k] = SR[i];
            }
            if (j <= n)
            {
                for (; j <= n; j++, k++)
                    TR[k] = SR[j];
            }
        }
        static void Msort(int[] SR, int[] TR1, int s, int t)
        {
            int[] TR2 = new int[TR1.Length];
            int m;
            if (s == t) TR1[s] = SR[s];
            else
            {
                m = (s + t) / 2;
                Msort(SR, TR2, s, m);
                Msort(SR, TR2, m + 1, t);
                Merge(TR2, TR1, s, m, t);
            }
        }
        //***********基数排序算法************
        static void jishupaixu(int[] Sqlist)
        {
            Console.WriteLine("***********基数排序算法************");
            int[] res = RadixSort(Sqlist, 5);
        }
        public static int[] RadixSort(int[] Array, int digit)
        {
            for (int k = 1; k <= digit; k++)
            {
                int[] tmpArray = new int[Array.Length];
                int[] tmpCount = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                for (int i = 0; i < Array.Length; i++)
                {
                    int tmpSp = Array[i] / (int)Math.Pow(10, k - 1) - (Array[i] / (int)Math.Pow(10, k)) * 10;
                    tmpCount[tmpSp] += 1;
                }
                for (int m = 1; m < 10; m++)
                {
                    tmpCount[m] += tmpCount[m - 1];
                }
                for (int n = Array.Length - 1; n >= 0; n--)
                {
                    int tmpSp = Array[n] / (int)Math.Pow(10, k - 1) - (Array[n] / (int)Math.Pow(10, k)) * 10;
                    tmpArray[tmpCount[tmpSp] - 1] = Array[n];
                    tmpCount[tmpSp] -= 1;
                }
                for (int p = 1; p < Array.Length; p++)
                {
                    Array[p] = tmpArray[p];
                }
            }
            return Array;
        }

    }
}

  

时间: 2024-10-11 07:01:26

C# 十大排序算法的相关文章

十大排序算法总结

排序算法术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成:外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行: 时间复杂度: 一个算法执行所耗费的时间.空间复杂度: 运行完一个程序所需内存的大小. 排序算法图片总结(图片来源于网络) 图片名词解释:n: 数据规模k:"桶"的个数In-place: 占用常数内存,不占用额外内存

十大排序算法--多图预警

十大排序算法 十大排序算法 简单的排序算法 插入排序 冒泡排序 选择排序 高效的比较排序算法 希尔排序 快速排序 归并排序 堆排序 牺牲空间的线性排序算法 计数排序 桶排序 基数排序 综合分析 简单的排序算法 Θ(n^2) 插入排序 动画演示 enter description here 原理 将数组看成两部分,一部分为已排序好的数组,后面的部分为未排序数组,每次从后面的数组中取出元素与前面的有序元素一一比较,若小于则向前移动,直到找到正确的位置插入.遍历后面的数组直到整个数组排序完成. 代码

十大排序算法总结(Python3实现)

十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码展示 1.冒泡排序 2.简单选择排序 3.简单插入排序 4.堆排序 5.快速排序 6.希尔排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 11.#代码说明 三.感悟总结 ________________________________________ 一.概述 排序算法大概是hello

十大排序算法整理(一):概览

十大排序算法分类.特点和关系 (1)冒泡排序(交换排序的一种) (2)选择排序 (3)插入排序 (4)归并排序(采用了分治思想,额外的空间复杂度O(N),容易记错,最后合并大数组的时候需要开辟一个长度为N的数组)  https://blog.csdn.net/u010452388/article/details/81008727 (5)快速排序(采用了分治思想,交换排序的一种,额外的空间复杂度O(NlogN),容易记错) 归并排序每次递归需要用到一个辅助表,长度与待排序的表相等,虽然递归次数是O

js十大排序算法详解

十大经典算法导图  图片名词解释:n: 数据规模k:"桶"的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存 1.冒泡排序 1.1  原始人冒泡排序 function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]

js十大排序算法收藏

十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存稳定性:排序后2个相等键值的顺序和排序之前它们的顺序相同 冒泡排序(Bubble Sort) 冒泡排序须知: 作为最简单的排序算法之一,冒泡排序给我的感觉就像Abandon在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉...冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,

JS十大排序算法

十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存稳定性:排序后2个相等键值的顺序和排序之前它们的顺序相同 冒泡排序(Bubble Sort) 什么时候最快(Best Cases): 当输入的数据已经是正序时 什么时候最慢(Worst Cases): 当输入的数据是反序时 冒泡排序动图演示: 冒泡排序JavaScript代码实现: function bubbleSo

十大排序算法之(二)——冒泡排序

#1,简介 冒泡排序是一种比较基础.简单的排序算法,它的思想就是:key值较大的会像泡泡一样被你挑选出来向后或者向前移,这具体取决于你想要的结果数组是大序排列还是小序排列. 操作:对数组(或者其他存储结构)依次遍历,比较相邻两个元素,若与你设定的顺序相反,则交换位置,然后对数组要进行len-1次这样的遍历(len是数组长度). #2,c++实现 #include<iostream>#include<vector> using namespace std; void BubbleSo

go语言十大排序算法总结

选择排序 选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置.这样,经过i遍处理之后,前i个记录的位置已经是正确的了. 选择排序是不稳定的.算法复杂度是O(n ^2 ). 个人总结: 选择排序,就是要又一个游标,每次在做比较的同时,纪录最大值,或者最小值的位置,遍历一遍之后,跟外层每次纪录的位置,做位置交换.为什么叫选择排序呢,估计就是这个原因,每次遍历一遍,选个最大或者最小的出来.算法因此得名. package main impor

十大排序算法 JAVA代码

冒泡排序 插入排序 选择排序 希尔排序 归并排序 快速排序 堆排序 计数排序 基数排序 桶排序  O是指计算机执行命令所需的时间 nlogn是算法的时间复杂度,一般排序用的是log2n 总体总结表:这个有个错误就是归并排序需要一个o(n)的辅助数组  冒泡排序 主要思想:外层循环从1到n-1,内循环从当前外层的元素的下一个位置开始,依次和外层的元素比较,出现逆序就交换. 特点:stable sort(稳定性排序).In-place sort(不占用额外的空间,只是交换元素) 最优复杂度:当输入数