本人应届生面试,发现被问了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. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

  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. LightOJ1119 Pimp My Ride(状压DP)

    dp[S]表示已经完成的工作集合 枚举从哪儿转移过来的,再通过枚举计算花费..水水的.. #include<cstdio> #include<cstring> #include ...

  4. extjs 远程数据源

    1本地数据源组合框 Ext.onReady(function(){ //创建数据模型 Ext.regModel('PostInfo', { fields: [{name: 'province'}, { ...

  5. BZOJ3290 : Theresa与数据结构

    CANCEL操作可以看作删点,X坐标可以离散化 将询问按Z坐标差分,转化成两个求Z<=某个数的和的询问 将操作CDQ分治 每次将前一半的修改.后一半的查询按照Z坐标排序 然后扫描线,每到一个询问 ...

  6. Vijos 1180 (树形DP+背包)

    题目链接: https://vijos.org/p/1180 题目大意:选课.只有根课选了才能选子课,给定选课数m, 问最大学分多少. 解题思路: 树形背包.cost=1. 且有个虚根0,取这个虚根也 ...

  7. topcoder SRM 593 DIV2 RaiseThisBarn

    #include <vector> #include <string> #include <list> #include <map> #include ...

  8. js-sdk探索之微信网页分享

    微信是一个很不错的传播平台,最近公司需要做一个新年贺卡,使用html5制作一个很小的动画,然后发送给客户,不需要和后台有任何的联系,一个很简单的功能,需要利用微信的分享功能,毕竟微信分享的带小图片.简 ...

  9. 最近公共祖先(lca)

    囧啊囧. lca的求法太多了 倍增,tarjan,st,lct,hld.... 后边三个我就不写了,其中st我没写过,估计用不上,在线用倍增,离线用tarjan就行了. 嗯. 第一种,倍增(O(nlo ...

  10. mysql中datetime与timestamp的比较

    相同 显示 TIMESTAMP列的显示格式与DATETIME列相同.换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS. 不同 范围 datetime 以'YYYY-M ...