冒泡排序与插入排序(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 ...
随机推荐
- 图文详解YUV420, yuv格式2
YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式,每个像素点的Y ...
- LinQ的一些基本语句
LINQ(Language Integrated Query)即语言集成查询.它是一种语言特性和API,使得你可以使用统一的方式编写各种查询,查询的对象包括xml.对象集合.SqlServer数据库等 ...
- JVM的GC理论详解
GC的概念 GC:Garbage Collection 垃圾收集.这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM(堆溢出) ...
- Javascript实现Linq查询方式
Linq是.net平台一个重要的技术,全称Language Integrated Query.通过构建快速查询语句,可快速从数据库或集合中筛选数据集.以查询数据库相同的方式操作内存数据. 在ECMAS ...
- 状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
题目传送门 题意:有n*m的房间,'.'表示可以被点亮,'#'表示不能被点亮,每点亮一个房间会使旁边的房间也点亮,有意盏特别的灯可以选择周围不同方向的房间点亮.问最少需要多少灯使得所有房间点亮 分析: ...
- LCIS POJ 2172 Greatest Common Increasing Subsequence
题目传送门 题意:LCIS(Longest Common Increasing Subsequence) 最长公共上升子序列 分析:a[i] != b[j]: dp[i][j] = dp[i-1][j ...
- MapReduce的输入输出格式
默认的mapper是IdentityMapper,默认的reducer是IdentityReducer,它们将输入的键和值原封不动地写到输出中. 默认的partitioner是HashPartitin ...
- POJ2823 Sliding Window(单调队列)
题目要输出一个序列各个长度k的连续子序列的最大值最小值. 多次RMQ的算法也是能过的,不过单调队列O(n). 这题,队列存元素值以及元素下标,队尾出队维护单调性然后入队,队首出队保持新元素下标与队首元 ...
- ISODATA算法
ISODATA算法是在k-均值算法的基础上,增加对聚类结果的'合并'和'分裂'两个操作,并 设定算法运行控制参数的一种聚类算法. 全称:Iterative Selforganizing Data An ...
- BZOJ1109 : [POI2007]堆积木Klo
f[i]表示第i个在自己位置上的最大值 则f[i]=max(f[j])+1 其中 j<i a[j]<a[i] a[i]-a[j]<=i-j -> j-a[j]<=i-a[ ...