本人应届生面试,发现被问了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. 手持PDA智能条码扫描RFID打印POS机

    手持PDA智能条码扫描RFID打印POS机   一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...

  2. http://blog.sina.com.cn/s/blog_5f103c9c0101atny.html

    http://blog.sina.com.cn/s/blog_5f103c9c0101atny.html http://www.oschina.net/question/117304_51525

  3. Codeforces 161D Distance in Tree(树的点分治)

    题目大概是,给一棵树,统计距离为k的点对数. 不会DP啊..点分治的思路比较直观,啪啪啪敲完然后AC了.具体来说是这样的: 树上任何两点的路径都可以看成是一条过某棵子树根的路径,即任何一条路径都可以由 ...

  4. (转)Hbase shell 常用命令(1)

    Hbase shell 常用命令(1) link:http://blog.csdn.net/scutshuxue/article/details/6988348 下面我们看看HBase Shell的一 ...

  5. 命令模式坚决svn树冲突(local unversioned, incoming add upon update)

    当工作目录修改删除过时更新使用svn更新就容易发生树冲突“Tree Confilict”.会出现类似提示. local unversioned, incoming add upon update 如果 ...

  6. USACO 5.4 Character Recognition(DP)

    非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的... 这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径... 写起来挺非常麻烦,代码不贴了,丢人... 把U ...

  7. BZOJ3211 花神游历各国

    Description   Input   Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 ...

  8. esper 事件引擎,各种事件类型示例代码

    原创文章 转载请注明出处 package com.hp.iot.engine.esper; import java.util.ArrayList; import java.util.HashMap; ...

  9. Centos python 2.6 升级到2.7.3

    wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2 sudo make all sudo mak install sudo mak ...

  10. linux开启ssh服务

    本文概略:1)ubuntu发行版开启ssh.2)centos发行版开启ssh 1.ubuntu发行版安装/开启ssh服务 1.1 安装ssh服务端 sudo apt-get install opens ...