本人应届生面试,发现被问了2次关于排序的算法。当时竟然没写出来!!!好吧,可能是用库函数多了,很久没搞算法了,在纸上写没感觉吧。

今天花了1个多小时写了下冒泡排序与插入排序(C#实现),并写了注释和小函数,力求算法分析透彻,自解释的代码。

 //优化建议:
//1.定义<>比较器(而不是传入字符串命令让函数判断),方便指定排序顺序
//2.凡是带有int endIndex, int insertValue参数的函数都应该做成重载,不指定则从数组开始,或直到数组末尾
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace SimpleDelegate
{
public class ArraySort
{
/// <summary>
/// 选择排序,从小到大
/// </summary>
/// <param name="arr">无需ref,数组为类(引用类型)自动传递指针(引用)</param>
public static void SelectionSort(int[] arr)
{
//循环,将下标为0(第一个元素)...len-2(最后第二个元素)的元素与其后元素中最小的交换
for (int i = ; i < arr.Length - ; i++)
{
//获取从i至数组末尾范围内最小元素的下标
int minIndex = GetMinIndex(arr, i);
//交换,将最小元素移至i处
Swap(ref arr[minIndex], ref arr[i]);
}
}
/// <summary>
/// 交换变量值
/// </summary>
public static void Swap(ref int i,ref int j)
{
int tmp = i;i = j; j = tmp;
}
/// <summary>
/// 找出下标beginIndex...len-1(最后一个元素)中最小的元素的下标
/// </summary>
/// <param name="arr">数组</param>
/// <param name="beginIndex">起始下标</param>
/// <returns>数组从下标i...len-1(最后一个元素)最小的元素的下标</returns>
public static int GetMinIndex(int[] arr, int beginIndex)
{
int min = beginIndex;
for (int j = beginIndex + ; j < arr.Length; j++)
{
if (arr[min] > arr[j])
min = j;
}
return min;
} /*********************************************************************/
/// <summary>
/// 插入排序,从小到大
/// </summary>
public static void InsertionSort(int[] arr)
{
for (int i = ; i < arr.Length; i++)
{
int insertValue = arr[i];
SortInsert(arr, i, insertValue);
}
}
/// <summary>
/// 按从小到大顺序插入元素。数组范围:开始至endIndex参数
/// </summary>
/// <param name="arr"></param>
/// <param name="endIndex">插入的数组结束范围</param>
/// <param name="insertValue">插入的元素</param>
public static void SortInsert(int[] arr, int endIndex, int insertValue)
{
//找出插入点的下标
int insertIndex = ; //假设是0
for (insertIndex = ; insertIndex < endIndex; insertIndex++)
{
if (insertValue < arr[insertIndex])
break;
}
//插入点和其后的元素后移
NextMove(arr,insertIndex,endIndex);
//插入元素
arr[insertIndex] = insertValue;
}
/// <summary>
/// 从后往前后移,并返回被移出的元素
/// 从前往后后移会导致覆盖(所有元素值变为arr[begIndex]的值)
/// </summary>
/// <param name="arr"></param>
/// <param name="begIndex">数组的开始索引</param>
/// <param name="endIndex">数组的结束索引</param>
/// <returns>被移出的元素</returns>
public static int NextMove(int[] arr, int begIndex, int endIndex)
{ for (int i = endIndex; i > begIndex; i--)
{
arr[i] = arr[i - ];
}
return arr[endIndex];
}
}
}

但还可以继续抽象,也没写冒泡排序和快速排序等,未完待续。。。

以下为运行代码:

  static void Main(string[] args)
{
int[] arr = new int[] { , , , , , , -, , , };
ArraySort.SelectionSort(arr);
//ArraySort.InsertionSort(arr);
foreach (var item in arr)
{
Console.WriteLine(item);
}
Console.WriteLine("------------");
Console.Read();
}

希望对各位有用!!有错也请指出。

冒泡排序与插入排序(C#实现)的更多相关文章

  1. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  2. JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  3. Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析

    阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...

  4. JS实现冒泡排序,插入排序和快速排序(从input中获取内容)

    以前参加面试的时候,被问到过让用JS实现一个快速排序,当时太年轻,并没有回答上来. 于是,这里便把三种排序都用JS来做了一下.结合html,从input文本框中获取输入进行排序. 关于这几种算法的原理 ...

  5. 三种排序算法python源码——冒泡排序、插入排序、选择排序

    最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...

  6. 【C++】冒泡排序、插入排序、快速排序

    #include<iostream> using namespace std; void BubbleSort(int *a,int istart,int len)//冒泡排序 { //a ...

  7. JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

    每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...

  8. java中数组的排序,直接排序,冒泡排序,插入排序

    1.直接排序: public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for ...

  9. 用js实现算法:冒泡排序、插入排序和快速排序

    一.冒泡排序 function bubbleSort(arr){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-i-1;j ...

随机推荐

  1. 基于Extjs的web表单设计器 第六节——界面框架设计

    基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...

  2. BZOJ3658 : Jabberwocky

    考虑将某线段下方的点取走: 将所有点从低到高排序 每扫描到一条水平线,对于上面每个点,找到它下面同色的前驱后继,统计中间点的个数 然后再把线上所有点插入数据结构中 最后再统计相邻的同色的点之间的点个数 ...

  3. android 获取当前屏幕作为毛玻璃模糊背景Acitivity作为弹出框。

    使用: 1.在执行弹出界面前,先将其当前屏幕截图. BlurBuilder.snapShotWithoutStatusBar(getActivity()); 2.为了确保界面切入无效果. startA ...

  4. 【wikioi】2800 送外卖(状压dp+floyd)

    http://www.wikioi.com/problem/2800/ 本题状压莫名其妙的tle了,(按照hzwer大神打的喂,他1000多ms,我就2000ms了?) (14.8.7更,将getnu ...

  5. CentOS GO 语言环境的搭建

    go 语言源码安装依赖 ,gcc ,make glibc库,等,上述工具安装省略, 这个是官方地址:http://www.golang.org/ 另外,其源代码更新采用的是mercurial 工具,安 ...

  6. SVN 中trunk、branches、tags

    SVN 中trunk.branches.tags   我们在一些著名开源项目的版本库中,通常可以看到trunk, branches, tags等三个目录.由于SVN固有的特点,目录在SVN中并没有特别 ...

  7. XSS的高级利用部分总结 -蠕虫

    XSS的高级利用部分总结 -蠕虫,HTTP-only,AJAX本地文件操作,镜象网页本帖最后由 racle 于 2009-5-30 09:19 编辑 XSS的高级利用总结 -蠕虫,HTTPONLY,A ...

  8. 下载站中的下载连接其实是php脚本文件控制

    什么是php文件,PHP是一种服务器端HTML-嵌入式脚本描述语言. 其最强大和最重要的特征是其数据库集成层,使用它完成一个含有数据库功能的网页是不可置信的简单.在HTML文件中, PHP脚本程序(语 ...

  9. VS2012网布网站与IIS配置

    一 VS发布 1首先是 点击自己创建的 web项目 ,右键发布 2  在之后出现的界面中选择配置文件 , 选择或导入发布配置文件,下拉框,选择新建 跳转到下一步 3 在连接界面中 在发布方法中选择文件 ...

  10. 《GK101任意波发生器》升级固件发布(版本:1.0.2build690)

    一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build690 编译日期:2015年4月24日 ====================================== 二. ...