算法实例

[冒泡排序算法]、[选择排序算法]

 1         /**
 2          * @Description:<p>冒泡排序算法实现</p>
 3          * @time:2016/03/29 下午14:40
 4          */
 5         public static void bubbleSort(int[] arr) {
 6
 7             if (arr == null || arr.Length == 0)
 8                 return;
 9             for (int i = 0; i < arr.Length - 1; i++) {
10                 for (int j = arr.Length - 1; j >i; j--)
11                 {
12                     if (arr[j] < arr[j - 1]) {
13                         swap(arr, j - 1, j);
14                     }
15                 }
16             }
17         }
18
19         public static void swap(int[] arr, int i, int j) {
20             int temp = arr[i];
21             arr[i] = arr[j];
22             arr[j] = temp;
23         }

 1 /*
 2          * @Description:<p>选择排序算法实现</p>
 3          * @time:2016/03/29 下午14:42
 4          */
 5
 6         public static void selectSort(int[] arr) {
 7             if (arr == null || arr.Length == 0)
 8                 return;
 9             int minIndex = 0;
10             for (int i = 0; i < arr.Length - 1; i++) { //只需要比较n-1次
11                 minIndex = i;
12                 for (int j = i + 1; j < arr.Length; j++) { //从i+1开始比较,因为minIndex默认为i了,i就没必要比了。
13                     if (arr[j] < arr[minIndex]) {
14                         minIndex = j;
15                     }
16                 }
17                 if (minIndex != i) { //如果minIndex不为i,说明找到了更小的值,交换之。
18                     swap(arr, i, minIndex);
19
20                 }
21             }
22
23         }
24
25         public static void swap(int[] arr, int i, int j) {
26             int temp = arr[i];
27             arr[i] = arr[j];
28             arr[j] = temp;
29         }

插入排序算法

 1  public static void insertSort(int[] arr) {
 2             if (arr == null || arr.Length == 0)
 3                 return;
 4             for (int i = 1; i < arr.Length; i++) {//假设第一个数位置正确的;要往后移,必须要假设第一个
 5                 int j = i;
 6                 int target = arr[i];  //待插入的
 7
 8                 //后移
 9                 while (j > 0 && target < arr[j - 1]) {
10                     arr[j] = arr[j - 1];
11                     j--;
12                 }
13                 //插入
14                 arr[j] = target;
15             }
16         }

快速排序算法

 1  //一次划分
 2         public static int partition(int[] arr, int left, int right)
 3         {
 4             int pivotKey = arr[left];
 5             int pivotPointer = left;
 6
 7             while (left < right)
 8             {
 9                 while (left < right && arr[right] >= pivotKey)
10                     right--;
11                 while (left < right && arr[left] <= pivotKey)
12                     left++;
13                 swap(arr, left, right); //把大的交换到右边,把小的交换到左边。
14             }
15             swap(arr, pivotPointer, left); //最后把pivot交换到中间
16             return left;
17
18         }
19
20         public static void quickSort(int[] arr, int left, int right)
21         {
22             if (left >= right)
23                 return;
24             int pivotPos = partition(arr, left, right);
25             quickSort(arr, left, pivotPos - 1);
26             quickSort(arr, pivotPos + 1, right);
27         }
28
29         public static void sort(int[] arr)
30         {
31             if (arr == null || arr.Length == 0)
32                 return;
33             quickSort(arr, 0, arr.Length - 1);
34         }
35
36         public static void swap(int[] arr, int left, int right)
37         {
38             int temp = arr[left];
39             arr[left] = arr[right];
40             arr[right] = temp;
41         }
42
43 ====================================优化以上代码
44 public static int partition(int[] arr, int left, int right)
45         {
46             int pivotKey = arr[left];
47             while (left < right)
48             {
49                 while (left < right && arr[right] >= pivotKey)
50                     right--;
51                 arr[left] = arr[right]; //把小的移动到左边
52                 while (left < right && arr[left] <= pivotKey)
53                     left++;
54                 arr[right] = arr[left];//把大的移动到右边
55             }
56             arr[left] = pivotKey;   //最后把pivot赋值到中间
57             return left;
58
59         }
60
61         public static void quickSort(int[] arr, int left, int right)
62         {
63             if (left >= right)
64                 return;
65             int pivotPos = partition(arr, left, right);
66             quickSort(arr, left, pivotPos - 1);
67             quickSort(arr, pivotPos + 1, right);
68         }
69         public static void sort(int[] arr)
70         {
71             if (arr == null || arr.Length == 0)
72                 return;
73             quickSort(arr, 0, arr.Length - 1);
74         }

希尔排序

 1  static void Main(string[] args)
 2         {
 3             int[] arr={1,22,32,13,35,42,48,55};
 4             shellSort(arr);
 5             for (int i = 0; i < arr.Length; i++)
 6             {
 7                 Console.Write("{0},", arr[i]);
 8             }
 9             Console.ReadLine();
10         }
11
12         public static void shellInsert(int[] arr, int d) {
13             for (int i = d; i < arr.Length; i++) {
14                 int j = i - d;
15                 int temp = arr[i];  //记录要插入的数据
16                 while (j >= 0 && arr[j] > temp) {   //从后向前,找到比其小的数的位置
17                     arr[j + d] = arr[j];    //向后挪动
18                     j -= d;
19                 }
20
21                 if (j != i - d)  //存在比其小的数
22                     arr[j + d] = temp;
23
24             }
25         }
26         public static void shellSort(int[] arr) {
27             if (arr == null || arr.Length == 0)
28                 return;
29             int d = arr.Length / 2;
30             while (d >= 1) {
31                 shellInsert(arr, d);
32                 d /= 2;
33             }
34         }

归并排序

 1         static void Main(string[] args)
 2         {
 3             int[] arr={1,22,32,13,35,42,48,55};
 4             mergeSort(arr);
 5             for (int i = 0; i < arr.Length; i++)
 6             {
 7                 Console.Write("{0},", arr[i]);
 8             }
 9             Console.ReadLine();
10         }
11
12         public static void mergeSort(int[] arr) {
13             mSort(arr, 0, arr.Length - 1);
14         }
15
16         public static void mSort(int[] arr, int left, int right) {
17             if (left >= right)
18                 return;
19             int mid = (left + right) / 2;
20
21             mSort(arr, left, mid);
22             mSort(arr, mid + 1, right);
23             merge(arr, left, mid, right);
24         }
25
26         public static void merge(int[] arr, int left, int mid, int right) {
27             //[left,mid][mid+1,right]
28             int[] temp = new int[right - left + 1];
29
30             int i = left;
31             int j = mid + 1;
32             int k = 0;
33             while (i <= mid && j <= right) {
34                 if (arr[i] <= arr[j])
35                 {
36                     temp[k++] = arr[i++];
37                 }
38                 else {
39                     temp[k++] = arr[j++];
40                 }
41             }
42
43             while (i <= mid) {
44                 temp[k++] = arr[i++];
45             }
46
47             while (j <= right) {
48                 temp[k++] = arr[j++];
49             }
50
51             for (int p = 0; p < temp.Length; p++) {
52                 arr[left + p] = temp[p];
53             }
54
55         }

时间: 2024-10-23 12:29:42

算法实例的相关文章

Floyd算法实例

~ 当k=0时,我们关注的是邻接矩阵的第0行和第0列,即顶点0的入边和出边: 考察矩阵中其他元素,如果元素D[i][j]向第0行和第0列的投影D[0][j]和D[i][0]都有值,就说明原图中从 i 到 j 存在一条经过顶点0的有向路径 i -> 0 -> j, 这样的路径包含的边数不会超过2,如果其权值小于D[i][j],则应用这个权值更新D[i][j],表明图中有向路径 i -> 0 -> j 相比原有路径更短. k=1.2时情况类似~ OK哒,哈哈~ Floyd算法实例,布布

MATLAB工具箱及算法实例

核心函数: (1) function[pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 [输出参数] pop--生成的初始种群 [输入参数] num--种群中的个体数目bounds--代表变量的上下界的矩阵eevalFN--适应度函数eevalOps--传递给适应度函数的参数options--选择编码形式(浮点编码或是二进制编码)[precisionF_or_B],如precision--变量进行二进制编码时指定的

javascript常用经典算法实例详解

javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与使用技巧,需要的朋友可以参考下 本文实例讲述了javascript常用算法.分享给大家供大家参考,具体如下: 入门级算法-线性查找-时间复杂度O(n)--相当于算法界中的HelloWorld ? 1 2 3 4 5 6 7 8 9 10 //线性搜索(入门HelloWorld) //A为数组,x为要

算法实例_线性表 By:比方

算法实例_线性表 By:比方 什么是线性表? 从线性表的功能逻辑上来看,线性表就是由n(n>=0)个数据元素的排序组合,数据由x1,x2,x3,...,xn结构有序的顺序排列. 线性表的结构和特点 1.              仅有一个开始节点x1,没有直接前趋节点,有妾只有一个直接后续节点x2: 2.              仅有一个终结节点xn,仅有一个前趋节点xn-1; 3.              对于同一个线性表,其中没一个数据的元素,都必须具备相同的数据结构类型, 且没一个元素

php短网址算法实例代码分享

php实现的短网址算法,理论上支持1,073,741,824个短网址. 每个网址用6个字符代替,(6^32) 最多可以拥有1,073,741,824个短网址.当然,你还可以记录更详细的信息,如访问记录,创建时间等.如果真不够用了,还可以删掉很久不用的. function shorturl($input) { $base32 = array ( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p

斐波那契递归和非递归俩种算法实例

package testcase; /** * * @decription \ \\_ .---(') o( )_-\_ 斐波那契递归和非递归俩种算法实例 * @author bjliuzezhou * @date 2016年2月23日 */ public class TypicalArithmetic_01 { public static void main(String[] args) { System.out.println(fn(6)); System.out.println(noRec

算法实例_链表结构 By:比方

前一章,我们说到了顺序表结构,而顺序表也存在一些的缺点. 在插入或者删除节点的时候,需要移动的数据比较大,如果顺序表结构比较大,有时候比较难以分配足够的连续存储空间,可能会导致内存分配失败,而导致无法存储. 而今天我们讲解的链表结构则可以很好的解决这个问题,链表的结构是一种动态存储分配的结构形式,可以根据需要动态申请所需的内存单元. 一.什么是链表结构? a)         我们用head来表示头节点. b)         数据部分保存的是存储的数据,地址地方指向下一个数据的起始部分,依次向

【机器学习】k-近邻算法以及算法实例

机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法. 一.kNN算法的工作原理 二.适用情况 三.算法实例及讲解 ---1.收集数据 ---2.准备数据 ---3.设计算法分析数据 ---4.测试算法 一.kNN算法的工作原理 官方解释:存在一个样本数据集,也称作训练样本集,并且样本中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最

C#彩色图片灰度化算法实例

本文实例讲述了C#彩色图片灰度化实现方法.分享给大家供大家参考.具体方法如下: 主要功能代码如下: 代码如下: public static Bitmap MakeGrayscale(Bitmap original) { //create a blank bitmap the same size as original Bitmap newBitmap = new Bitmap(original.Width, original.Height); //get a graphics object fr

数据结构与算法实例(数组实现)

数据结构与算法实例分析-数组 ★数组是一种最简单的数据结构,它占据一块连续的内存并且顺序存储数据,所以我们需要首先指定数组的大小 ★数组的空间效率不是很好,会有空闲的区域没有得到充分的应用 ★时间复杂度为O(1); ★数组一旦被定义,它的维度和维界就不会再改变,因此除了结构的初始化和销毁之外,数组就只有存取和修改元素值得操作 1.数组的存储结构 2.基本操作 ⑴.建造空间并进行初始化:struct triple triple_init(int v1,int v2,int v3); ⑵.释放已开辟