算法学习-常用排序

简介:

他家都说:“程序员到最后比的是算法”,我对算法也算情有独钟,最近这些天,没事的时候就看看算法相关的书,感觉还是算法能体现一个程序员的能力,今天学习了常用的排序算法,不好意思还是C#代码:

 

复制代码
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SuanFa
{
public class SortMethod
{
//插入排序
//把数B与其前面的数比较,如果B比其前面的数C小,
//那么C到B之间的数都向后移一位,C所在的位置由B代替
public bool InsertSort(int[] A, int n)
{
int sortData;
for (int i = 1; i < n; i++)
{
sortData
= A[i];
for (int j = 0; j < i; j++)//循环一次只为插进一个数,循环n-1次即可
{
if (A[j] > sortData)
{
for (int k = i; k > j; k--)//j-i之间的数向后移一位
{
A[k]
= A[k - 1];
}
A[j]
= sortData;
break;//break在这里很重要,如果没有break,你看看A[j]=sortData;就执行了i-k次,
// 排序后就会出现同一个数出现多次,当然有的数就去掉了。
}
}
}

return true;
}

//冒泡排序
public bool BubbleSort(int[] A, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < i; j++)
{
if (A[j] > A[i])
{
int tmp = A[j];
A[j]
= A[i];
A[i]
= tmp;
}
}
}

return true;
}

//选择排序
//把当前要排序的那个数与它后面的数进行比较,如果哪个数更小,就让这个更小的输入与后面的数进行比较,
//一直比较下去,将当前要排序的数与更小的那个数交换
public bool SelectSort(int[] A, int n)
{
for (int i = 0; i < n - 1; i++)
{
int k = i;
for (int j = i + 1; j < n; j++)
{
if (A[j] < A[k])
{
k
= j;
}
}

if (k != i)
{
int tmp = A[k];
A[k]
= A[i];
A[i]
= tmp;
}
}
return true;
}


#region 合并排序
/// <param name="A">被排序的数组</param>
/// <param name="l">开始排序的下标</param>
/// <param name="r">结束排序的下标</param>
/// <param name="n">数组最后一个元素的下标</param>
private void Merge(int[] A, int e, int r, int n)
{
int n1 = r - e ;
int n2 = n - r+1;
int[] e1 = new int[n1];
int[] r1 = new int[n2];
for (int t = 0; t < n1; t++)
{
e1[t]
= A[e + t];
}
for (int t = 0; t < n2; t++)
{
r1[t]
= A[r + t];
}
int i = 0, j = 0, k = e;
while (i < n1 && j < n2)
{
if (e1[i] <= r1[j])
{
A[k
++] = e1[i++];
}
else
{
A[k
++] = r1[j++];
}
}
while (i < n1)
{
A[k
++] = e1[i++];
}
while (j < n2)
{
A[k
++] = r1[j++];
}
}

public void MergeSort(int[] A, int r, int n)
{
if (r < n)
{
int p=(n+r)/2;
MergeSort(A,r,p);
MergeSort(A,p
+1,n);
Merge(A,r,p,n);
}
}
#endregion

//合并两个数组,合并排序的思想就是合并两个数组
public int[] MergeTwo(int[] A, int[] B)
{
int n1 = A.Length;
int n2 = B.Length;
int[] C = new int[n1 + n2];
int i=0,j =0,k=0;
while (i < n1 && j < n2)
{
if (A[i] > B[j])
{
C[k
++] = B[j++];
}
else {
C[k
++] = A[i++];
}
}
while (i < n1)
{
C[k
++] = A[i++];
}

while (j < n2)
{
C[k
++] = B[j++];
}
return C;
}

//哈希算法

//老实说这段代码不是我写的,哈希算法的确有点难懂,但我还是会他搞定
public void HillSort(int[] list)
{
int inc;
for (inc = 1; inc <= list.Length / 9; inc = 3 * inc + 1) ;

for (; inc > 0; inc /= 3)
{
for (int i = inc + 1; i <= list.Length; i += inc)
{
int t = list[i - 1];
int j = i;
while ((j > inc) && (list[j - inc - 1] > t))
{
list[j
- 1] = list[j - inc - 1];
j
-= inc;
}
list[j
- 1] = t;
}
}
}

}
}
复制代码
目录
相关文章
|
19天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
11天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
53 8
|
11天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
42 7
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
19天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
19天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
19天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明