6大排序算法,c#实现
using System;
using System.Text;
using System.Collections.Generic; namespace ArithmeticPractice
{
static class ExtendsFunction
{
public static string printArray(this Array p_arr)
{
StringBuilder sb = new StringBuilder("[ ");
for(int i = ; i < p_arr.Length ; i++)
{
if(i != )
{
sb.Append(", ");
}
sb.Append(p_arr.GetValue(i));
}
sb.Append (" ]");
return sb.ToString ();
}
}
class MainClass
{
public static void Main (string[] args)
{
int[] arr = new int[]{, , , , , , , };
int[] sortedArr = null;
while(true)
{
Console.WriteLine ("请选择算法(从小到大排序):\n0.退出 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.堆排序");
string choose = Console.ReadLine (); Console.WriteLine("排序前:" + arr.printArray());
switch(choose) {
case "":
sortedArr = bubbleSort(arr);
break;
case "":
sortedArr = chooseSort(arr);
break;
case "":
sortedArr = insertSort(arr);
break;
case "":
sortedArr = shellSort(arr);
break;
case "":
sortedArr = quickSort(arr);
break;
case "":
sortedArr = heapSort(arr);
break;
default:
return;
}
Console.WriteLine("排序后:" + sortedArr.printArray());
}
}
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="p_arr">P_arr.</param>
private static int[] bubbleSort(int[] p_arr)
{
for(int i = p_arr.Length - ; i > ; i--)
{
for(int j = p_arr.Length - ; j > p_arr.Length - i - ; j--)
{
if(p_arr[j - ] > p_arr[j] )
{
int temp = p_arr[j];
p_arr[j] = p_arr[j - ];
p_arr[j - ] = temp;
}
}
}
return p_arr;
}
/// <summary>
/// 选择排序
/// </summary>
/// <param name="p_arr">P_arr.</param>
private static int[] chooseSort(int[] p_arr)
{
for(int i = ; i < p_arr.Length ; i++)
{
var l_min = p_arr[i];
for(int j = i + ; j < p_arr.Length; j++)
{
if(l_min > p_arr[j])
{
l_min = p_arr[j];
p_arr[j] = p_arr[i];
p_arr[i] = l_min;
}
}
}
return p_arr;
}
/// <summary>
/// 插入排序
/// </summary>
/// <returns>The sort.</returns>
/// <param name="p_arr">P_arr.</param>
private static int[] insertSort(int[] p_arr)
{
List<int> list = new List<int> ();
list.Add (p_arr []);
for (int i = ; i < p_arr.Length; i++)
{
int j = ;
for(; j < list.Count ; j++)
{
if(p_arr[i] < list[j])
{
list.Insert(j, p_arr[i]);
break;
}
}
if(j == list.Count)
{
list.Add(p_arr[i]);
}
}
return list.ToArray ();
}
/// <summary>
/// 希尔排序
/// </summary>
/// <returns>The sort.</returns>
/// <param name="p_arr">P_arr.</param>
private static int[] shellSort(int[] p_arr)
{
int l_cache;//用来缓存符合交换条件的那一个(这里缓存小的,因为排序是从小到大)
int l_space = p_arr.Length;// 交换的间隔,人称增量
while(l_space > ){
l_space = l_space/ + ;// 间隔缩小,最后一定要是1,所以不能space/2+1
for(int index = l_space; index < p_arr.Length; index++)
{
if(p_arr[index] < p_arr[index - l_space])//当前index和index-space的需要进行交换
{
l_cache = p_arr[index];//缓存最小的那个
int j;
//*进行一次必然为true的判断,把index的值设置为前面比较大的那个,然后在往前去看看间隔为space的位置的数(假定为temp),有没有比cache的还要大的,(cache的值不变)如果有的话就设置当前位置(不是index而是j+space)设置为假定为temp,然后继续往前看
for(j = index - l_space; j >= && l_cache < p_arr[j]; j -= l_space)
{
p_arr[j + l_space] = p_arr[j];
}
p_arr[j + l_space] = l_cache;
}
}
}
return p_arr;
}
/// <summary>
/// 快速排序
/// </summary>
/// <returns>The sort.</returns>
/// <param name="p_arr">P_arr.</param>
private static int[] quickSort(int[] p_arr, int p_left = , int p_right = )
{
int l_left = p_left;
int l_right = p_right;
if(l_right == )
{
l_right = p_arr.Length - ;
p_right = p_arr.Length - ;
}
if (l_right > )
{
int l_middle = p_arr[ (l_left + l_right) / ];//中值,不一定为最中间,仅仅作为一个判断依据,是最小或者最大的都无所谓
Console.WriteLine(" l_left " + l_left + " l_right " + l_right + " l_middle " + l_middle);
while( l_left < l_right)
{//从左边开始检索
if (p_arr [l_left] >= l_middle)
{//遇到了左边比中值要大的
while( l_right > l_left)
{//开始检索右边的
if (p_arr [l_right] < l_middle)
{//遇到右边比中值要小的,交换此时左右flag的数然后左边继续
int l_temp = p_arr [l_right];
p_arr [l_right] = p_arr [l_left];
p_arr [l_left] = l_temp;
l_right--;
break;
} else
{
l_right--;
}
}
}
l_left++;
}
Console.WriteLine("--- l_left " + l_left + " l_right " + l_right + " l_middle " + l_middle);
if(p_left < l_right)
{//此处只所以从p_left~l_right,而不是p_left~l_left,是因为上面的l_left++了,l_right--了
quickSort (p_arr, p_left, l_right);
} if(l_left < p_right)
{
quickSort (p_arr, l_left, p_right);
}
}
return p_arr;
}
/// <summary>
/// 堆排序.
/// </summary>
/// <returns>The sort.</returns>
/// <param name="p_arr">P_arr.</param>
private static int[] heapSort(int[] p_arr)
{// 要求最后结果是从小到大,所以堆顶要放最大的元素
int l_last = p_arr.Length - ;//从堆地元素上溯初始化堆
int l_index = l_last; while(l_index > )
{
int l_parent = (l_index + )/ - ;
if(p_arr[l_index] > p_arr[l_parent])
{ //大于父节点,交换
int temp = p_arr[l_index];
p_arr[l_index] = p_arr[l_parent];
p_arr[l_parent] = temp;
checkChild(p_arr, l_index, l_last);
} else {
int l_borther = l_index % == ? l_index - : l_index + ;//当前如果是右节点,则兄弟为左,反之亦然
if(l_borther <= l_last && p_arr[l_borther] > p_arr[l_parent])
{//兄弟节点大于父节点,交换
int temp = p_arr[l_borther];
p_arr[l_borther] = p_arr[l_parent];
p_arr[l_parent] = temp;
checkChild(p_arr, l_borther, l_last);
} else
{
l_index = l_parent;
}
}
}
Console.WriteLine ("初始化堆:" + p_arr.printArray ());
while(l_last > )
{
int temp = p_arr[l_last];
p_arr[l_last] = p_arr[];
p_arr[] = temp;
l_last--;
checkChild(p_arr, , l_last);
}
return p_arr;
} private static void checkChild(int[] p_arr, int p_index, int p_last)
{
int l_index = p_index;
while(l_index < p_last)
{
int l_leftIndex = * l_index + ;//l_index的左子
int l_rightIndex = * l_index + ;//l_index的柚子
if(l_leftIndex > p_last && l_rightIndex > p_last)
{//末节点
break;
}
if( l_leftIndex <= p_last && p_arr[l_leftIndex] > p_arr[l_index])
{//左子大于父节点,交换
int temp = p_arr[l_index];
p_arr[l_index] = p_arr[l_leftIndex];
p_arr[l_leftIndex] = temp;
checkChild(p_arr, l_leftIndex, p_last);
}
if( l_rightIndex <= p_last && p_arr[l_rightIndex] > p_arr[l_index])
{//右子大于父节点,交换
int temp = p_arr[l_index];
p_arr[l_index] = p_arr[l_rightIndex];
p_arr[l_rightIndex] = temp;
checkChild(p_arr, l_rightIndex, p_last);
}
l_index++;
}
}
}
}
6大排序算法,c#实现的更多相关文章
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- Algorithm --> 十大排序算法
十大排序算法 主要排序法有: 一.冒泡( Bubble)排序—— 相邻交换 二.选择排序 ——每次最小/ 大排在相应的位置 三.插入排序 ——将下一个插入已排好的序列中 四.壳( Shell) ...
- [ 转载 ] js十大排序算法:冒泡排序
js十大排序算法:冒泡排序 http://www.cnblogs.com/beli/p/6297741.html
- 九大排序算法Java实现
之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...
- 十大排序算法JavaScript实现总结
花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...
- 十大排序算法总结(Python3实现)
十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...
- 一篇夯实一个知识点系列--python实现十大排序算法
写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...
- C语言实现九大排序算法
C语言实现九大排序算法 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序 C语言实现九大排序算法 直接插入排序 将数组分为两个部分,一个是有序部分,一 ...
- 使用 js 实现十大排序算法: 快速排序
使用 js 实现十大排序算法: 快速排序 QuickSort 快速排序 /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @c ...
随机推荐
- 方法:怎么用ionic命令行调试你的ionic app
官网上有很详细的解说 http://blog.ionic.io/live-reload-all-things-ionic-cli/ 下面说说我自己的调试过程(android版): 首先用命令行进入你 ...
- (hdu)1257 最少拦截系统
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1257 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦 ...
- Poj 2583 Series Determination
1.Link: http://poj.org/problem?id=2583 2.Content: Series Determination Time Limit: 1000MS Memory L ...
- GDB 进行调试 使用心得
GDB 进行调试 使用心得 转 1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的. 需要像以下这样使用: #gdb app ...
- jobs
fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& 最经常被用到这个用在一个命令的最后,可以把这个命令放到 ...
- c#winform,制作可编辑html编辑器
大神勿喷,新手记笔记 材料 网上下载kindeditor,动手在写个htmldome,图中的e.html.然后全部扔到了bin/debug下面,(x86是要扔到bin/x86/debug) 中间bod ...
- gridview 字段没有绑定由于column visible= false
由于gridview column visible=false, 后面执行gridview databound()操作 不会将数据绑定到相关的单元格,其实这个时候我们希望绑定数据只是不显示而已. 可以 ...
- js判断屏幕分辨率的代码
通过下面的代码判断分辨率 <script language="JavaScript"> <!-- Begin function redirectPage() { ...
- YII千万级PV架构经验分享--理论篇
hello,大家好,我是方少,现在想象一下这样一个情景,这是一个很惬意的季节,是一个可以随意乱穿的季节,两个人,一个穿羽绒服,一个穿热裤,小胡同里两人迎面走来,看到对方都哈哈大笑,前仰后合,笑完都甩一 ...
- 前端构建工具gulp入门教程
本文假设你之前没有用过任何任务脚本(task runner)和命令行工具,一步步教你上手Gulp.不要怕,它其实很简单,我会分为五步向你介绍gulp并帮助你完成一些惊人的事情.那就直接开始吧. 第一步 ...