c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
using System;
using System.Text; namespace HuaTong.General.Utility
{
/// <summary>
/// 自定义排序类
/// </summary>
public class Sorter
{
/// <summary>
/// 交换元素位置
/// </summary>
public static void Swap<T>(ref T[] arr, int i, int j)
{
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
} /// <summary>
/// 冒泡排序
/// </summary>
public static T[] BubbleSort<T>(T[] arr) where T : IComparable
{
for (int i = arr.Length - ; i > ; --i)
{
for (int j = ; j < i; ++j)
{
if (arr[j].CompareTo(arr[j + ]) > )
{
Swap(ref arr, j, j + );
}
}
}
return arr;
} /// <summary>
/// 选择排序
/// </summary>
public static T[] SelectionSort<T>(T[] arr) where T : IComparable
{
for (int i = ; i < arr.Length; ++i)
{
int index = i;
for (int j = i + ; j < arr.Length; ++j)
{
if (arr[j].CompareTo(arr[index]) < ) index = j;
}
Swap(ref arr, i, index);
}
return arr;
} /// <summary>
/// 插入排序
/// </summary>
public static T[] InsertionSort<T>(T[] arr) where T : IComparable
{
for (int i = ; i < arr.Length; ++i)
{
int j = i;
T value = arr[i];
while (j > && arr[j - ].CompareTo(value) > )
{
arr[j] = arr[j - ];
--j;
}
arr[j] = value;
}
return arr;
} /// <summary>
/// 希尔排序
/// </summary>
public static T[] ShellSort<T>(T[] arr) where T : IComparable
{
for (int step = arr.Length >> ; step > ; step >>= )
{
for (int i = ; i < step; ++i)
{
for (int j = i + step; j < arr.Length; j += step)
{
int k = j;
T value = arr[j];
while (k >= step && arr[k - step].CompareTo(value) > )
{
arr[k] = arr[k - step];
k -= step;
}
arr[k] = value;
}
}
}
return arr;
} /// <summary>
/// 快速排序
/// </summary>
public static T[] QuickSort<T>(T[] arr, int startIndex, int endIndex) where T : IComparable
{
int i, j;
T x, y; i = (startIndex < ? : startIndex);
j = (endIndex > arr.Length - ? arr.Length - : endIndex);
if (startIndex > endIndex) return null;
x = arr[(i + j) / ]; while (i <= j)
{
while (arr[i].CompareTo(x) < && i < endIndex)
{
i = i + ;
}
while (x.CompareTo(arr[j]) < && j > startIndex)
{
j = j - ;
}
if (i <= j)
{
y = arr[i];
arr[i] = arr[j];
arr[j] = y;
i = i + ;
j = j - ;
}
} if (startIndex < j) QuickSort(arr, startIndex, j);
if (i < endIndex) QuickSort(arr, i, endIndex); return arr;
} /// <summary>
/// 归并排序
/// </summary>
public static T[] MergeSort<T>(T[] arr, int startIndex, int endIndex, T[] arrF) where T : IComparable
{
startIndex = (startIndex < ? : startIndex);
endIndex = (endIndex > arr.Length - ? arr.Length - : endIndex);
arrF = new T[arr.Length];
if (startIndex >= endIndex) return null;
int m = (startIndex + endIndex) >> ;
MergeSort(arr, startIndex, m, arrF);
MergeSort(arr, m + , endIndex, arrF);
for (int i = startIndex, j = startIndex, k = m + ; i <= endIndex; ++i)
{
arrF[i] = arr[(k > endIndex || j <= m && arr[j].CompareTo(arr[k]) < ) ? j++ : k++];
}
for (int i = startIndex; i <= endIndex; ++i) arr[i] = arrF[i]; return arr;
} /// <summary>
/// 堆排序
/// </summary>
public static T[] HeapSort<T>(T[] arr) where T : IComparable
{
for (int i = ; i < arr.Length; ++i)
{
for (int j = i, k = (j - ) >> ; k >= ; j = k, k = (k - ) >> )
{
if (arr[k].CompareTo(arr[j]) >= ) break;
Swap(ref arr, j, k);
}
}
for (int i = arr.Length - ; i > ; --i)
{
Swap(ref arr, , i);
for (int j = , k = (j + ) << ; k <= i; j = k, k = (k + ) << )
{
if (k == i || arr[k].CompareTo(arr[k - ]) < ) --k;
if (arr[k].CompareTo(arr[j]) <= ) break;
Swap(ref arr, j, k);
}
}
return arr;
}
}
}
c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)的更多相关文章
- C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)
算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...
- python 数据结构与算法之排序(冒泡,选择,插入)
目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...
- java 基础排序(冒泡、插入、选择、快速)算法回顾
java 基础排序(冒泡.插入.选择.快速)算法回顾 冒泡排序 private static void bubbleSort(int[] array) { int temp; for (int i = ...
- python 中的一些基础算法:递归/冒泡/选择/插入
递归算法 如果一个函数包含了对自己的调用,那么这个函数就是递归的. 比如我们计算下1-7乘法的计算: def func(n): if n ==1 : return 1 return n*func(n- ...
- 【数据结构 C++】排序——冒泡、插入、选择、希尔、归并、快排、堆排序
LeetCode 912. 排序数组 给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = ...
- 基本排序-冒泡/选择/插入(python)
# -*- coding: utf-8 -*- import random def bubble_sort(seq): n = len(seq) for i in range(n-1): print( ...
- php中usort自定义排序如何使用
php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort — 使 ...
- php六种基础算法:冒泡,选择,插入,快速,归并和希尔排序法
$arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法 * 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. * 比 ...
- iOS 开发中常用的排序(冒泡、选择、快速、插入、希尔、归并、基数)算法
1.冒泡排序: 冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素.如果一个元素比另一个元素大(小),那么就交换这两个元素的位置.重复这一比较直至最后一个元素.这一比较会重复n-1 ...
随机推荐
- Java如何清空数组、对象
//清空 public class Clear { public static void main(String[] args){ // List<String> a= new Array ...
- tomcat结合memcached构建session服务器
memcached服务器两台:192.168.223.136,192.168.223.137 tomcat多实例:192.168.233.146:8081,192.168.223.146:8082 f ...
- 【Swift实现代码】iOS架构模式之MVP
1.什么是MVP? MVP是模型(Model).视图(View).主持人(Presenter)的缩写,分别代表项目中3个不同的模块. 1.1 模型 (Model):负责处理数据的加载或存储 1.2 视 ...
- [BZOJ]BST again
Description 求有多少棵大小为n的深度为h的二叉树.(树根深度为0:左右子树有别:答案对1000000007取模) Input 第一行一个整数T,表示数据组数. 以下T行,每行2个整数n和h ...
- ISSCC 2017论文导读 Session 14 Deep Learning Processors,A 2.9TOPS/W Deep Convolutional Neural Network SOC
最近ISSCC2017大会刚刚举行,看了关于Deep Learning处理器的Session 14,有一些不错的东西,在这里记录一下. A 2.9TOPS/W Deep Convolutional N ...
- python2.7.10 VS2015编译方法
打开 Python-2.7.10\PCbuild目录 然后设置只编译python和pythoncore: 好了,编译试一试. 出现了好几个错误.由于 VS2015 取消了 timezone 的定义,改 ...
- [PostgreSql]PostgreSql创建函数及函数的执行
1.准备好创建函数的脚本 -- FUNCTION: public.dynamic_placelist_select(integer, timestamp without time zone) -- D ...
- 如何高效的使用 Git
-- 代码昨天还是运行好好的今天就不行了. 代码被删了. 突然出现了一个奇怪的 bug,但是没人知道怎么回事. 如果你出现过上面的任何一种情况,那本篇文章就是为你准备的. 除了知道 git add, ...
- php5权限控制修饰符,interface和abstract
1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...
- bzoj3673可持久化并查集
n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^ ...