几种排序(c#实现)
代码:
int[] arr = { 2, 3, 4, 6, 1, 5, 4 };
// 冒泡排序:把最小的往前冒 O(n2)
//int temp1;
//for (int i = 0; i < arr.Length - 1; i++)
//{
// for (int j = i + 1; j < arr.Length; j++)
// {
// if (arr[j] < arr[i])
// {
// temp1 = arr[j];
// arr[j] = arr[i];
// arr[i] = temp1;
// }
// }
//}
// 选择排序:从小到大依次选出来 O(n2)
//for (int i = 0; i < arr.Length - 1; i++)
//{
// int temp2 = arr[i];
// int index = i;
// for (int j = i + 1; j < arr.Length; j++)
// {
// if (arr[j] < temp2)
// {
// temp2 = arr[j];
// index = j;
// }
// }
// arr[index] = arr[i];
// arr[i] = temp2;
//}
// 直接插入排序:适合基本有序 O(n2)
//for (int i = 1; i < arr.Length; i++)
//{
// int temp = arr[i];
// int j;
// for (j = i - 1; j >= 0; j--)
// {
// if (temp > arr[j])
// {
// break;
// }
// arr[j + 1] = arr[j];
// }
// arr[j + 1] = temp;
//}
// 希尔排序
//int gap = arr.Length / 2;
//while (gap >= 1)
//{
// // 把距离为 gap 的元素编为一个组,扫描所有组
// for (int i = gap; i < arr.Length; i++)
// {
// int j = 0;
// int temp = arr[i];
// // 对距离为 gap 的元素组进行排序
// for (j = i - gap; j >= 0 && temp < arr[j]; j = j - gap)
// {
// arr[j + gap] = arr[j];
// }
// arr[j + gap] = temp;
// }
// gap = gap / 2;
//}
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
Console.ReadLine();
二、程序员内功修炼(排序)
1、直接插入排序:适合数组基本有序的情况
像打扑克牌,从前往后对应,把数字插入到合适的位置,如:

初始值3,认为一个已经有序的序列
第一次遍历:6和3比
第二次遍历:5和6、5和3
第三次遍历:9和6
弟四次遍历:7和9、7和6
以此类推。。
代码:
public static int[] InsertionSort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-输入的序列为降序,复杂度为O(n^2)
最优时间复杂度-输入的序列为升序,复杂度为O(n)
辅助空间-O(1)
稳定性-稳定
*/
for (int i = 1; i < arr.Length; i++)
{
int temp = arr[i];
int j = i - 1;
while (j >= 0 && temp < arr[j])
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
return arr;
}
2、二分插入排序(是对直接插入排序的改进):适合数组较长的情况
直接插入排序每次遍历均是从右往左找,直到找到比自己小的,当序列足够长的情况下,这很耗时
二分是取前面有序序列的中间值做对比,一半一半缩小范围,减少排序对比时间。
public static int[] BinarySort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-输入的序列为降序,复杂度为O(n^2)
最优时间复杂度-输入的序列为升序,复杂度为O(log2 n)
辅助空间-O(1)
稳定性-稳定
*/
for (int i = 1; i < arr.Length; i++)
{
int temp = arr[i];
int low = 0;
int high = i - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (temp >= arr[mid])
low = mid + 1;
else
high = mid - 1;
}
for (int j = i - 1; j >= low; j--)
{
arr[j + 1] = arr[j];
}
arr[low] = temp;
}
return arr;
}
3、希尔排序
又称为缩小增量排序,定义排序间隔,并逐步缩小增量,如图:

public static int[] ShellSort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-根据步长的不同而不同,已知最好的为O(n(log2 n)^2)
最优时间复杂度-O(n)
辅助空间-O(1)
稳定性-不稳定
*/
for (int gap = arr.Length / 2; gap >= 1; gap = gap / 2)
{
for (int i = gap; i < arr.Length; i++)
{
int temp = arr[i];
int j = i - gap;
while (j >= 0 && temp < arr[j])
{
arr[j + gap] = arr[j];
j = j - gap;
}
arr[j + gap] = temp;
}
}
return arr;
}
4、冒泡排序
最小的往前冒 或者 最大的往后冒
public static int[] BubbleSort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-O(n^2)
最优时间复杂度-O(n^2)
辅助空间-O(1)
稳定性-稳定
*/
for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[j] < arr[i])
{
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
5、快速排序(目前最好的排序)
以第一个元素为基准值,把剩余元素小的放前边,大的放后边

public static int[] QuickSort(int[] arr, int low, int high)
{
/*
数据结构-数组
最差时间复杂度-每次选取的基准值都是最大或者最小O(n^2)
最优时间复杂度-每次选取的基准值都是中位数O(nlogn)
辅助空间-主要是递归造成的栈空间的使用,取决于递归树的深度,一般为O(logn),最差为O(n)
稳定性-不稳定
*/
if (low >= high)
return arr;
int i = low;
int j = high;
int temp = arr[i];//基准值
while (i < j)//从两端向中间扫描,跳出循环时i=j
{
while (i < j && arr[j] >= temp)//从右往左
j--;
arr[i] = arr[j];
while (i < j && arr[i] <= temp)//从左往右
i++;
arr[j] = arr[i];
}
arr[i] = temp;// 基准值回归正确位置
QuickSort(arr, low, i - 1);
QuickSort(arr, i + 1, high);
return arr;
}
6、直接选择排序
直接选择最小的,和第一位替换位置,以此类推
public static int[] SelectionSort(int[] arr)
{
/*
数据结构-数组
最差时间复杂度-O(n^2)
最优时间复杂度-O(n^2)
辅助空间-O(1)
稳定性-不稳定
*/
for (int i = 0; i < arr.Length - 1; i++)
{
int k = i; // k指向最小值索引
for (int j = i + 1; j < arr.Length; j++)
if (arr[j] < arr[k])
k = j;
if (k != i)
{
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
return arr;
}
几种排序(c#实现)的更多相关文章
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 几种排序算法的学习,利用Python和C实现
之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...
- ACM 一种排序
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- 秒杀9种排序算法(JavaScript版)
一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...
- nyoj 8 一种排序
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
- java数组中的三种排序方法中的冒泡排序方法
我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...
- PHP的几种排序算法的比较
这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助 /* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 85 ...
- java实现8种排序算法(详细)
八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...
随机推荐
- async.js 版本兼容问题 async.filter举例
async3.x 和async2.6.1 版本下 const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; // Usin ...
- Karmada多云多集群生产实践专场圆满落幕
摘要:CNCF Karmada社区Cloud Native Days China 2022南京站成功举办. 本文分享自华为云社区<Karmada多云多集群生产实践专场圆满落幕|Cloud Nat ...
- 巧用视觉障眼法,还原 3D 文字特效
最近群里有这样一个有意思的问题,大家在讨论,使用 CSS 3D 能否实现如下所示的效果: 这里的核心难点在于,如何利用 CSS 实现一个立体的数字?CSS 能做到吗? 不是特别好实现,但是,如果仅仅只 ...
- 2022USACO-DEC-Silver
题目链接 T1.Barn Tree T2.Circular Barn T3.Range Reconstruction T1 下面均以\(1\)为根来进行分析. 算法思路: 首先,定义一个数组dis表示 ...
- python之路26 面向对象魔法方法、元类、元类定制类、对象的产生行为 __new__方法
面向对象的魔法方法 魔法方法:类中定义的双下方法都称为魔法方法 不需要人为调用 在特定的条件下会自动触发运行 eg:__init__创建空对象之后自动触发给对象添加独有的数据 1.__init__ 对 ...
- 【深入浅出Spring原理及实战】「源码调试分析」结合DataSourceRegister深入分析ImportBeanDefinitionRegistrar的源码运作流程
每日一句 人的一生中不可能会一帆风顺,总会遇到一些挫折,当你对生活失去了信心的时候,仔细的看一看.好好回想一下你所遇到的最美好的事情吧,那会让你感觉到生活的美好. 注入案例代码 如何通过实现Sprin ...
- Anaconda和pip常用命令汇总:简单,通俗易懂
前言 在学习 anaconda 的常用命令之前要先安装好 Anaconda for Windows,Anaconda for Ubuntu,这里我总结了 Windows 环境下和 Ubuntu 环境下 ...
- Unity之正确设置手机显示布局&&获取手机朝向
目录 Unity之正确设置手机显示布局 && 获取手机朝向 前言 开篇 Unity版本及使用插件 正题 设置手机屏幕显示布局.Screen.orientation 获取手机当前朝向.I ...
- 读Java8函数式编程笔记05_数据并行化
1. 并发 1.1. 两个任务共享时间段 1.2. 一个程序要运行两个任务,并且只有一个CPU给它们分配了不同的时间片,那么这就是并发,而不是并行 2. 并行 2.1. 两个任务在同一时间发生 2.2 ...
- linux/windows解决/关闭端口占用
Linux 找到占用端口的进程信息: netstat -lnp|grep 端口号 例如:netstat -lnp|grep 8080 就是找到正在使用8080端口的进程 关闭进程: kill -9 进 ...