C#之快速排序 C#之插入排序 C#之选择排序 C#之冒泡排序
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#之冒泡排序的更多相关文章
- 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较
我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...
- C# 冒泡排序法、插入排序法、选择排序法
冒泡排序法 是数组等线性排列的数字从大到小或从小到大排序. 以从小到大排序为例. 数据 11, 35, 39, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, ...
- 算法分析-插入排序INSERT_SORT与选择排序SELECT_SORT【线性方法】
var A = [5, 2, 4, 6, 1, 3]; console.log("排序前-:") A.forEach(function (element, index, arr) ...
- PHP算法排序之快速排序、冒泡排序、选择排序、插入排序性能对比
<?php //冒泡排序 //原理:从倒数第一个数开始,相邻的两个数比较,后面比前面的小,则交换位置,一直到比较第一个数之后则最小的会排在第一位,以此类推 function bubble_sor ...
- Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...
- 选择排序O(n^2)与快速排序O(nlogn)的优越性代码体现
随机函数生成一个超大数组: [code]: #include <iostream> #include <stdio.h> #include<time.h> #inc ...
- [Java]数组排序-选择排序 冒泡排序 插入排序
1 选择排序 原理:a 将数组中的每个元素,与第一个元素比较 如果这个元素小于第一个元素, 就将这个 两个元素交换. b 每轮使用a的规则, 可以选择出 ...
- java数组排序(插入排序、冒泡排序、选择排序)与递归 代码示例
import java.util.Scanner; public class OrderBy { public static void main(String[] args) { // Scanner ...
- java面向对象的冒泡排序,选择排序和插入排序的比较
这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0 ...
随机推荐
- CV方向:纽劢科技,复星,蚂蚁金服,哈喽出行,海康威视
以下均为CV方向实习面试,岗位算法工程师助理.时间均在2019年3月至4月之间. 纽劢科技(均电话): 技术2面,HR1面 复星(现场): 技术只有1面 ...
- struts2 前端显示错误信息
当我们显示错误信息的时候,会发现错误信息会以列表的形式显示,这样就不美观了,达不到我们想要的标准.所以我们可以用另外的方式输出错误信息. 例如我现在增加了两个错误信息: this.addFieldEr ...
- 19Web服务
Web服务 Web服务 Micosoft.Net平台架构中的分布式系统主要包括两部分:用ASP.Net技术构建服务器端动态网页,以及Web服务(Web Service或XML Web Service) ...
- SQL Server中 sysobjects、sysolumns、systypes
1.sysobjects 系统对象表. 保存当前数据库的对象,如约束.默认值.日志.规则.存储过程等 在大多数情况下,对你最有用的两个列是Sysobjects.name和Sysobjects.x ...
- 四、spring中高级装配(2)
这个是接着上一篇写的,这章内容较多,分开来记录一下... 三.处理自动装配的歧义性 自动装配让spring完全负责bean引用注入到构造参数和属性中,不过,仅有一个bean匹配所需的结果时,自动装配才 ...
- 微信小程序(template的使用)
小程序的template是一个模版功能,在创建一个template后,其他的页面可以引用,相比component较简单.方便! template只需要两个文件,一个wxss文件和wxml文件,也只有这 ...
- BZOJ 2055 80人环游世界 有上下界最小费用可行流
题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. 因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ...
- Win2008 Server搭建FTP服务器
首先创建一个专门的FTP用户,当然也可以不创建. 用系统自带的超管用户. 设置用户名和密码.用户下次登陆必须修改密码记得去掉勾选. 在角色里面的WEB服务器找到添加角色服务.我之前有安装IIS. 没有 ...
- 理解ZAB协议
ZAB协议 介绍 1.zab协议是为分布式协调服务zookpeer专门设计的一种支持崩溃恢复的原子广播协议 2.在zookeeper中主要依赖ZAB协议来实现数据一致性,基于该协议zk实现了一种主备模 ...
- Rightmost Digit (求n^n最后一位)
Description Given a positive integer N, you should output the most right digit of N^N. Input The ...