偶然间看了一篇微信上的文章,里面介绍了十大算法,分别是:
一:快速排序算法
二:堆排序算法
三:归并排序
四:二分查找算法
五:BFPRT(线性查找算法)
六:DFS(深度优先搜索)
七:BFS(广度优先搜索)
八:Dijkstra算法
九:动态规划算法
十:朴素贝叶斯分类算法
虽然前面自己整理里几个基本排序查找算法,但看了这篇文章真有点惭愧啊!因此想抽空学习整理一下这些算法。
首先就从快速排序算法入手,废话不多说,上图:
不过,正式写之前还是有必要做一些简单介绍,掌握一个好的算法,它的背景尝试也得了解一下嘛!
1、算法的概念:
5、实现代码:
public static void QuickSort(int n[], int left, int right) {
int mid;
if (left < right) {
mid = Partion(n, left, right);
QuickSort(n, left, mid - 1);
QuickSort(n, mid + 1, right);
}
}
public static int Partion(int n[], int left, int right) {
int pivot = n[left];// 也可以从n[right]开始
while (left < right) {
while (left < right && n[right] >= pivot)
right--;
if (left < right) {
n[left++] = n[right];
}
while (left < right && n[left] <= pivot)
left++;
if (left < right) {
n[right--] = n[left];
}
}
n[left] = pivot;
return left;
}
为了更加直观的显示算法运行过程中数组数据变化情况,这里可以加一个打印函数:
public static void printList(int[] n) {
int len = n.length;
for (int i = 0; i < len; i++) {
System.out.print(n[i] + ",");
}
System.out.println("");
}
随便写一个数组int n[] = { 7, 8, 1, 9, 5, 10, 3, 2, 11 };
通过打印中间结果来展示排序情况,完整代码如下:
package com.lxzh123.quicksort;
/**
* @author: lxzh
* @E-mail: 1239848066@qq.com
* @qq: 1239848066
* @Date: 2015年8月1日上午12:01:31
* @version: 1.0 Dscription: 快速排序
*/
public class QuickSortDemo {
public static void main(String[] args) {
int n[] = { 7, 8, 1, 9, 5, 10, 3, 2, 11 };
printList(n);
QuickSort(n, 0, n.length - 1);
printList(n);
}
public static void QuickSort(int n[], int left, int right) {
int mid;
if (left < right) {
mid = Partion(n, left, right);
QuickSort(n, left, mid - 1);
QuickSort(n, mid + 1, right);
}
}
public static int Partion(int n[], int left, int right) {
int pivot = n[left];// 也可以从n[right]开始
while (left < right) {
while (left < right && n[right] >= pivot)
right--;
if (left < right) {
n[left++] = n[right];
printList(n);
}
while (left < right && n[left] <= pivot)
left++;
if (left < right) {
n[right--] = n[left];
printList(n);
}
System.out.println();
}
n[left] = pivot;
printList(n);
return left;
}
public static void printList(int[] n) {
int len = n.length;
for (int i = 0; i < len; i++) {
System.out.print(n[i] + ",");
}
System.out.println("");
}
}
编译运行后输出结果:
7,8,1,9,5,10,3,2,11,
2,8,1,9,5,10,3,2,11,
2,8,1,9,5,10,3,8,11,
2,3,1,9,5,10,3,8,11,
2,3,1,9,5,10,9,8,11,
2,3,1,5,5,10,9,8,11,
2,3,1,5,7,10,9,8,11,
1,3,1,5,7,10,9,8,11,
1,3,3,5,7,10,9,8,11,
1,2,3,5,7,10,9,8,11,
1,2,3,5,7,10,9,8,11,
1,2,3,5,7,8,9,8,11,
1,2,3,5,7,8,9,10,11,
1,2,3,5,7,8,9,10,11,
1,2,3,5,7,8,9,10,11,
如果闲来没事的话,读者可以利用这个排序原理自己制作文中的那个动图,有兴趣的可以尝试一下!
注:动态图片展示的是以数组最后一个值为基准,稍微修改一下上述代码就可以达到动图中的效果。