冒泡排序与插入排序(C#实现)
本人应届生面试,发现被问了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#实现)的更多相关文章
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
- JS实现冒泡排序,插入排序和快速排序(从input中获取内容)
以前参加面试的时候,被问到过让用JS实现一个快速排序,当时太年轻,并没有回答上来. 于是,这里便把三种排序都用JS来做了一下.结合html,从input文本框中获取输入进行排序. 关于这几种算法的原理 ...
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...
- 【C++】冒泡排序、插入排序、快速排序
#include<iostream> using namespace std; void BubbleSort(int *a,int istart,int len)//冒泡排序 { //a ...
- JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
- java中数组的排序,直接排序,冒泡排序,插入排序
1.直接排序: public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for ...
- 用js实现算法:冒泡排序、插入排序和快速排序
一.冒泡排序 function bubbleSort(arr){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-i-1;j ...
随机推荐
- 【HTML5】拖放(Drag 和 drop)
效果图: <!DOCTYPE HTML> <html> <head> <style type="text/css"> #div1 { ...
- Linux常用命令_(备份压缩)
备份打包:tar 指令名称:tar语法:tar 选项[zcvf] [文件或目录]-z 使用gzip压缩.tar文件-c 产生一个.tar文件-v 观看归档过程-f 指定归档后的文件功能描述:归档文件目 ...
- HealthKit开发快速入门教程之HealthKit开发概述简介
HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...
- extjs 远程数据源
1本地数据源组合框 Ext.onReady(function(){ //创建数据模型 Ext.regModel('PostInfo', { fields: [{name: 'province'}, { ...
- HTML head 头标签
HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多差异性.移动互联网时代,head 头部结 ...
- Grunt配置文件编写技巧及示范
受益于grunt这么久,继续分享关于grunt的一些技巧.grunt确实是前端项目中不可或缺的提升效率的工具.第一次接触grunt是在去年7月份,开始有接触LESS.Coffee Script的等需要 ...
- wp ApplicationBar
WP7中的菜单栏 一个应用程序的菜单栏的内容是有限的,最多不超过4个,排列顺序是以菜单栏中间为中心,然后从左往右排列. WP7提供了两种类型的菜单栏,一种是全局的菜单栏,也就是说在所有的页面中都会出现 ...
- Shell之sed用法 转滴
通过例子学习sed的用法 1,sed介绍 sed可删除(delete).改变(change).添加(append).插入(insert).合.交换文件中的资料行,或读入其它档的资料到 文> ...
- winform学习-----理解小概念-20160518
一.设置滚动,滚动列遮住内容的解决办法 1.datagridview三个属性:autosizecolumsmode none autosizeRowsmode none dock fill 2. ...
- spark Mllib SVM实例
Mllib SVM实例 1.数据 数据格式为:标签, 特征1 特征2 特征3…… 0 128:51 129:159 130:253 131:159 132:50 155:48 156:238 157: ...