C#之快速排序

 

算法描述

1.假定数组首位元素为“枢轴”,设定数列首位(begin)与末位(end)索引;

2.由末位索引对应元素与“枢轴”进行比较,如果末位索引对应元素大于“枢轴”元素,对末位索引减一(end--),直到比较出大于“枢轴”元素,将该元素覆盖到首位,对应索引上的数值空出;

3.由首位索引对应元素与“枢轴”进行比较,如果首位索引对应元素小于“枢轴”元素,对首位索引加一(begin++);直到比较出小于“枢轴”元素,将该元素覆盖到步骤2中空出位置,同时对应索引上的数值空出;

4.重复步骤2与步骤3,直到begin==end结束循环,这时候begin与end已指向同一位置,将“枢轴”元素覆盖到该位置;

5.这时候该位置前面元素都小于“枢轴”元素,该位置后面元素都大于“枢轴”元素,第一轮循环结束,对前后两部分执行相同步骤,通过“递归”最终将数组中数值完成排序;

代码实现

        public int[] Quick(int[] arr, int begin, int end) // 通过自我调用实现“递归”
        {
            if (begin >= end)
            {
                return arr;
            }

            int pivotIndex = QuickCondition(arr, begin, end); // 获得“枢轴”索引

            Quick(arr, begin, pivotIndex - 1); // 对所有小于“枢轴”元素再次比较
            Quick(arr, pivotIndex + 1, end);// 对所有大于“枢轴”元素再次比较

            return arr;
        }

        public int QuickCondition(int[] arr, int begin, int end)
        {
            int pivot = arr[begin]; // 设定首位为“枢轴”元素

            while (begin < end)
            {
                while (arr[end] > pivot && begin < end) // 通过比较找到小于“枢轴”元素的索引,进行替换
                {
                    end--;
                }

                arr[begin] = arr[end];

                while (arr[begin] < pivot && begin < end) // 通过比较找到第大于“枢轴”元素的索引,进行替换
                {
                    begin++;
                }

                arr[end] = arr[begin];
            }
            arr[begin] = pivot; // 当begin == end 跳出循环将“枢轴”覆盖到该索引上

            return begin;
        }

完整代码

using System;

namespace QuickSortApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var setArray = new SetArray();
            var quickSort = new QuickSort();

            int[] arr = setArray.GetArray();
            int[] array = quickSort.Quick(arr, 0, arr.Length - 1);
            quickSort.DisPlay(array);

            Console.ReadLine();
        }
    }

    class SetArray
    {
        public int[] GetArray()
        {
            int length;
            int[] arr;

            Console.WriteLine("请输入数组长度:");
            length = Convert.ToInt32(Console.ReadLine());

            arr = new int[length];

            for (int i = 0; i <= length - 1; i++)
            {
                Console.Write("请输入数组第{0}位数值:", i);
                arr[i] = Convert.ToInt32(Console.ReadLine());
            }

            Console.Clear();

            Console.Write("arr[] = {");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
            Console.Write("}\n");
            return arr;
        }
    }

    class QuickSort
    {
        public int[] Quick(int[] arr, int begin, int end) // 通过自我调用实现“递归”
        {
            if (begin >= end)
            {
                return arr;
            }

            int pivotIndex = QuickCondition(arr, begin, end); // 获得“枢轴”索引

            Quick(arr, begin, pivotIndex - 1); // 对所有小于“枢轴”元素再次比较
            Quick(arr, pivotIndex + 1, end);// 对所有大于“枢轴”元素再次比较

            return arr;
        }

        public int QuickCondition(int[] arr, int begin, int end)
        {
            int pivot = arr[begin]; // 设定首位为“枢轴”元素

            while (begin < end)
            {
                while (arr[end] > pivot && begin < end) // 通过比较找到小于“枢轴”元素的索引,进行替换
                {
                    end--;
                }

                arr[begin] = arr[end];

                while (arr[begin] < pivot && begin < end) // 通过比较找到第大于“枢轴”元素的索引,进行替换
                {
                    begin++;
                }

                arr[end] = arr[begin];
            }
            arr[begin] = pivot; // 当begin == end 跳出循环将“枢轴”覆盖到该索引上

            return begin;
        }

        public void DisPlay(int[] arr)
        {
            Console.Write("快速排序:");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }
    }
}

C#之插入排序

 

算法描述

1.假定数组第一位为有序序列,抽出后一位元素与有序序列中元素依次比较;

2.如果有序序列元素大于抽出元素,将该元素向后移位;

3.重复前面步骤依次抽取无序序列中首位元素进行比较,直到所有数值排序完成;

代码实现

        /*
        例如:对数组:{ 2,7,6,3,1 }进行比较 

        第一轮:{ 2,7,6,3,1 } :共比较一次
        第二轮:{ 2,6,7,3,1 } :共比较二次
        第三轮:{ 2,3,4,7,1 } :共比较三次
        第四轮:{ 1,2,3,6,7 } :共比较四次
        */
        public void Insert(int[] arr)
        {
            int number;
            int numIndex;

            for (int i = 1; i < arr.Length; i++)
            {
                number = arr[i];
                numIndex = i - 1;

                while (numIndex >= 0 && number < arr[numIndex])
                {
                    arr[numIndex + 1] = arr[numIndex];
                    numIndex--;
                }

                arr[numIndex + 1] = number;

                Console.Write("插入排序:");
                foreach (int item in arr)
                {
                    Console.Write(item + " ");
                }
                Console.WriteLine();
            }

        }

完整代码

using System;

namespace InsertSortApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var setArray = new SetArray();
            var insertSort = new InsertSort();

            int[] arr = setArray.GetArray();
            insertSort.Insert(arr);

            Console.ReadLine();
        }
    }

    class SetArray
    {
        public int[] GetArray()
        {
            int length;
            int[] arr;

            Console.WriteLine("请输入数组长度:");
            length = Convert.ToInt32(Console.ReadLine());

            arr = new int[length];

            for (int i = 0; i <= length - 1; i++)
            {
                Console.Write("请输入数值第{0}位数值:", i);
                arr[i] = Convert.ToInt32(Console.ReadLine());
            }

            Console.Clear();

            Console.Write("arr[] = {");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
            Console.Write("}\n");
            return arr;
        }
    }

    class InsertSort // 插入排序
    {
        public void Insert(int[] arr)
        {
            int number;
            int numIndex;

            for (int i = 1; i < arr.Length; i++)
            {
                number = arr[i];
                numIndex = i - 1;

                while (numIndex >= 0 && number < arr[numIndex])
                {
                    arr[numIndex + 1] = arr[numIndex];
                    numIndex--;
                }

                arr[numIndex + 1] = number;
            }

            Console.Write("插入排序:");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();

        }
    }
}

C#之选择排序

 

算法描述

1.假定未排序序列中第一位为数组最小值,通过与后面的数值进行比较,找到未排序序列中最小值,与未排序序列第一位交换位置;

2.重复步骤一,对剩余未排序序列进行比较找出最小值,与未排序序列中第一位数值交换位置,直到数组所有数值排序完成;

代码实现

/*
        例如:对数组:{ 2,7,6,3,1 }进行比较 

        第一轮:{ 1,7,6,3,2 } :共比较四次
        第二轮:{ 1,2,6,3,7 } :共比较三次
        第三轮:{ 1,2,3,6,7 } :共比较二次
        第四轮:{ 1,2,3,6,7 } :共比较一次
        */
        public void Select(int[] arr)
        {
            int temp;
            int number;
            int numIndex;

            bool flag;

            for (int i = 0; i < arr.Length -1; i++)
            {
                flag = true;
                number = arr[i];
                numIndex = i;

                for (int j = i + 1; j < arr.Length; j++)
                {
                    if (number > arr[j])
                    {
                        number = arr[j];
                        numIndex = j;
                        flag = false;
                    }
                }

                temp = arr[i];
                arr[i] = arr[numIndex];
                arr[numIndex] = temp;

                if (flag == true)
                {
                    break;
                }

                Console.Write("选择排序:");
                foreach (int item in arr)
                {
                    Console.Write(item + " ");
                }
                Console.WriteLine();

            }
        }

完整代码

using System;

namespace SelectSortApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var setArray = new SetArray();
            var selectSort = new SelectSort();

            int[] arr = setArray.GetArray();
            selectSort.Select(arr);

            Console.ReadLine();
        }
    }

    class SetArray
    {
        public int[] GetArray()
        {
            int length;
            int[] arr;

            Console.WriteLine("请输入数组长度:");
            length = Convert.ToInt32(Console.ReadLine());

            arr = new int[length];

            for (int i = 0; i <= length -1; i++)
            {
                Console.Write("请输入数组第{0}位数值:", i);
                arr[i] = Convert.ToInt32(Console.ReadLine());
            }

            Console.Clear();

            Console.Write("arr[] = {");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
            Console.Write("}\n");
            return arr;
        }
    }

    class SelectSort
    {
        public void Select(int[] arr)
        {
            int temp;
            int number;
            int numIndex;

            bool flag;

            for (int i = 0; i < arr.Length -1; i++)
            {
                flag = true;
                number = arr[i];
                numIndex = i;

                for (int j = i + 1; j < arr.Length; j++)
                {
                    if (number > arr[j])
                    {
                        number = arr[j];
                        numIndex = j;
                        flag = false;
                    }
                }

                temp = arr[i];
                arr[i] = arr[numIndex];
                arr[numIndex] = temp;

                if (flag == true)
                {
                    break;
                }
            }
            Console.Write("选择排序:");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }
    }
}

C#之冒泡排序

 

算法描述

1.由数组第一位数值开始与相邻数值进行比较,每次将比较后大的数值后移。最后将会把数组中最大值移动到数组最后;

2.依次对数组中未排序序列重复进行比较排序,将比较后的最大值移动到未排序序列的最后;

代码实现

     /*
        例如:对数组:{ 5,4,3,2,1 }进行比较 

        第一轮:{ 4,3,2,1,5 } :共比较四次
        第二轮:{ 3,2,1,4,5 } :共比较三次
        第三轮:{ 2,1,3,4,5 } :共比较二次
        第四轮:{ 1,2,3,4,5 } :共比较一次
        */
        public void Bubble(int[] arr)
        {
            int temp;

            bool flag;

            for (int i = 0; i < arr.Length - 1; i++) // 循环轮数
            {
                flag = true;

                for (int j = 0; j < arr.Length - i - 1; j++) // 比较次数
                {
                    if (arr[j] > arr[j + 1])
                    {
                        temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                        flag = false;
                    }
                }

                if (flag == true)
                {
                    break;
                }
            }

            Console.Write("冒泡排序:");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
        }

完整代码

using System;

namespace BubbleSortApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var setArray = new SetArray();
            var bubbleSort = new BubbleSort();

            int[] arr = setArray.GetArray();

            bubbleSort.Bubble(arr);

            Console.ReadLine();
        }
    }

    class SetArray // 数组类
    {
        public int[] GetArray()
        {
            int length; // 数组长度
            int[] arr; 

            Console.WriteLine("请输入数组长度:");
            length = Convert.ToInt32(Console.ReadLine());

            arr = new int[length];

            for (int i = 0; i <= length - 1; i++)
            {
                Console.Write("请输入数组第{0}位数值:", i);
                arr[i] = Convert.ToInt32(Console.ReadLine());
            }

            Console.Clear();

            Console.Write("arr[] = {");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
            Console.Write("}\n");

            return arr;
        }
    }

    class BubbleSort // 冒泡排序
    {
        public void Bubble(int[] arr)
        {
            int temp;

            bool flag;

            for (int i = 0; i < arr.Length - 1; i++)
            {
                flag = true;

                for (int j = 0; j < arr.Length - i - 1; j++)
                {
                    if (arr[j] > arr[j + 1])
                    {
                        temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                        flag = false;
                    }
                }

                if (flag == true)
                {
                    break;
                }
            }

            Console.Write("冒泡排序:");
            foreach (int item in arr)
            {
                Console.Write(item + " ");
            }
        }
    }
}

C#之快速排序 C#之插入排序 C#之选择排序 C#之冒泡排序的更多相关文章

  1. 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较

    我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...

  2. C# 冒泡排序法、插入排序法、选择排序法

    冒泡排序法 是数组等线性排列的数字从大到小或从小到大排序. 以从小到大排序为例. 数据 11, 35, 39, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, ...

  3. 算法分析-插入排序INSERT_SORT与选择排序SELECT_SORT【线性方法】

    var A = [5, 2, 4, 6, 1, 3]; console.log("排序前-:") A.forEach(function (element, index, arr) ...

  4. PHP算法排序之快速排序、冒泡排序、选择排序、插入排序性能对比

    <?php //冒泡排序 //原理:从倒数第一个数开始,相邻的两个数比较,后面比前面的小,则交换位置,一直到比较第一个数之后则最小的会排在第一位,以此类推 function bubble_sor ...

  5. Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析

    前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...

  6. 选择排序O(n^2)与快速排序O(nlogn)的优越性代码体现

    随机函数生成一个超大数组: [code]: #include <iostream> #include <stdio.h> #include<time.h> #inc ...

  7. [Java]数组排序-选择排序 冒泡排序 插入排序

    1 选择排序  原理:a 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.       b 每轮使用a的规则, 可以选择出 ...

  8. java数组排序(插入排序、冒泡排序、选择排序)与递归 代码示例

    import java.util.Scanner; public class OrderBy { public static void main(String[] args) { // Scanner ...

  9. java面向对象的冒泡排序,选择排序和插入排序的比较

    这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0 ...

随机推荐

  1. HTTP的工作原理

    客户机与服务器建立连接后,发送一个请求给服务器,请求格式为:统一资源标识符.协议版本号.服务器收到请求的信息(包括请求行,请求头,请求体).服务器接收到请求后,给予相应的响应信息,格式为一个状态行(包 ...

  2. 04Struts2的配置文件

    Struts2的配置文件 1.1 struts.xml中的标签详解 1.1.1     constant标签 作用: 用于修改struts2中的常量 属性: name:指定常量的key value:指 ...

  3. python 弹窗

    import ctypes message = ctypes.windll.user32.MessageBoxA(0,'message','tips',0)

  4. 初识Typescript及vscode环境配置

    什么是typescript?为什么要用它? typescript简称ts,是js语法的一个超级,由微软团队维护的 js特点(不足) 弱类型:js中的数据变量没有确定的类型,可以存储对象,可以存储数字, ...

  5. 秋招复习-C++( 一)

    Linux/Unix编程部分 1.进程间通信方式:信号,信号量,消息队列,共享内存,套接字Socket 2.ipcs: Linux/Unix下的命令,可以用来查看当前系统中所使用的进程间通信方式的各种 ...

  6. 每日命令:(13)more

    more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...

  7. (八)python3 迭代

    迭代:如果给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或tuple,这种遍历我们称为迭代(Iteration) 字典: >>> d = {'a ...

  8. C++解决大数组问题

    今天写一个C++小程序,竟然出现:"VS 未经处理的异常: 0xC00000FD: Stack overflow" 查了一下,普通数组变量是在堆栈中保存的,而堆栈空间有限,故出此错 ...

  9. Zoj 3781(构造)

    Zoj 3781(构造) Zoj 3781 As we all know, Coach Gao is a talented chef, because he is able to cook M dis ...

  10. Uva 839天平(二叉树dfs, 递归建树)

    题意: 给定一个天平长度 输入格式为 wl dl wr dr 分别代表天平左边长度,左边重量, 右边长度, 右边重量. 如果重量为0, 说明下面还有一个天平, 递归给出. 样例输入:10 2 0 40 ...