几种排序(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种排序算法(详细)
八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...
随机推荐
- uniapp onLoad里面拿不到reject的参数
在onLoad中直接调用自己用promise封装的请求 reject居然会收不到参数.. onLoad(){ this.$fetch(xxxx) .catch(err=>{ }) // 这里获取 ...
- 用Python来写个小型购物车程序
0x1 前言 Python语言能做很多东西的,像数据分析啊.自动化.开发. 爬虫(真的很棒哟,初学者玩很有成就感的啊哈哈)等等还有挺多. 0x2 用Python编写的一个小型购物车程序 import ...
- 利用WordPress搭建属于自己的网站
怎么用WordPress给自己搭建了一个网站?可能很多人都想拥有属于自己的网站,这篇文章就找你怎么利用WordPress搭建属于自己的网站.如果你也正好有搭建个人网站的想法,那么本文会给你一个参考,我 ...
- BBS项目 未完待续
项目开发基本流程 1.需求分析 2.架构设计 3.分组开发 4.提交测试 5.交付上线 创建项目配置 环境配置 TEMPLATES = [ { 'BACKEND': 'django.template. ...
- 推荐一款在浏览器编辑`Blazor`的`IDE`
不知道是否有Blazor用户羡慕过React或者Vue用户,在一些组件库中,它们就提供了在当前的组件预览对于组件的实时编辑并且预览? 比如semi-design的这种 在比如codepen这种 由于B ...
- python3.10调用邮件SMTP报错: ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)解决
一: python3.10调用邮件SMTP报错: ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake fa ...
- Docker使用阿里云拉取配置源也无法拉取的镜像-github镜像镜像gcr.io
我搞了一天都没搞好,最后用了这个办法解决了拉取镜像的问题 对于大部分镜像来说,我们配置源就可以,但是对于较新的镜像,没得搞啊,铁子们,真的崩溃... 最终发现可以通过Aliyun的自动构建来处理被墙镜 ...
- strapi系列-如何创建一个定时任务-Cron Jobs
Cron 是什么? Cron 有多种用途. Cron Jobs 用于安排服务器上的任务运行.它们最常用于自动化系统管理或维护.然而,它们也与 Web 应用程序的构建相关. Web 应用程序可能需要在各 ...
- Ionic 设置全局变量,三种方法设置图片一种是直接增加,一种是replace,第三种是管道和第二种类似
- 12.ThreadLocal的那点小秘密
大家好,我是王有志.关注王有志,一起聊技术,聊游戏,聊在外漂泊的生活. 好久不见,不知道大家新年过得怎么样?有没有痛痛快快得放松?是不是还能收到很多压岁钱?好了,话不多说,我们开始今天的主题:Thre ...