若是有幸能看到java
排序:假设含有n个记录的序列{R1,R2,R3..,Rn},其中的关键字序列为{K1,K2,K3...,Kn}。将这些记录从新排序为{Ri1,Ri2,Ri3,Rin} ,使得相应的关键字知足Ki1<=Ki2<=..<=Kim,这样的一种操做被称为排序。git
一般来讲,排序的目的是快速查找github
衡量排序算法的优点:算法
排序算法分类:内部排序和外部排序编程
经常使用的内部排序api
基本原理: 将待排序的元素分为已排序和未排序,依次将为排序的元素中最小的元素放入已排序的组中,数组
直接排序简单直观,但性能略差:堆排序是一种较为搞笑的选择排序。但实现起来略为复杂。数据结构
代码实现:性能
import java.util.Arrays.*;
//选择排序,
public class SelectSort{
public static void selectSort(int[] data) {
int arrayLength = data.length;
for (int i = 0; i < arrayLength - 1 ; i++ ) {
for (int j= i +1; j < arrayLength; j++ ) {
if (data[i] > data[j]) {
swap(data,i,j);
}
}
}
System.out.println("排序后 " + java.util.Arrays.toString(data));
}
//第一种经过临时变量来完成交换
//注意这里能够用另一中一种方式
static void swap(int[] data,int i,int j) {
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
public static void main(String[] args) {
int[] data = {3,4,2,6,8,1,9};
selectSort(data);
}
}
复制代码
改进版的选择排序:学习
//选择排序算法
//选择排序算法
//一、主要思想就是每次假设一个最小的值
public class SelectSort1 {
public static void selectSort1(int[] data) {
int arraylength = data.length;
for (int i = 0; i < arraylength - 1; i++ ) {
int minIndex = i; //每次假设一个最小值下标
for (int j = i + 1; j < arraylength ; j++ ) {
if (data[minIndex] > data[j]) {
minIndex = j;
}
}
//判断须要交换的下标是否为本身
if (minIndex != i) {
data[minIndex] = data[minIndex] + data[i];
date[i] = date[minIndex] - data[i];
data[minIndex] = data[minIndex] - data[i];
}
}
//输出结果
for (int d :data ) {
System.out.println("排序以后:" + d);
}
}
public static void main(String[] args) {
int[] data = {3,4,2,6,8,1,9};
selectSort1(data);
}
}
复制代码
直接选择排序效率分析
算法的时间效率:不管初始化状态如何,在第i趟排序中选择最小的元素,须要n-1次比较
算法的空间效率:空间效率较高,只须要一个附加程序单元用于交换,其空间效率为O(1)
算法的稳定性:不稳定
资料和代码来自这家,有一种感受,年代越远,越重视基础。如今的培训呢?
堆排序就是把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束
这个有点难啊,下一个。回来再来看。
相邻两元素进行比较,若有须要则进行交换,每完成一次循环就将最大元素排在前面(从小到大排序)下一次循环是将其余的数进行相似的比较。
代码实现:
//冒泡排序
public class BubbleSort {
static void sort(int[] data) {
int len = data.length;
for (int i = 0; i < len - 1; i++ ) {
for (int j = 0 ; j < len - 1 - i; j++ ) {
if (data[j] > data[j + 1]) {
swap(data,j,j+1);
}
}
}
}
static void swap(int[] data,int i,int j) {
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
public static void main(String[] args) {
int[] data = {4,2,6,8,2,1,0};
sort(data);
for(int d : data) {
System.out.print("->" + d);
}
}
}
复制代码
冒泡排序效率分析:
快速排序(Quick Sorting)基本思想是:任取待排序序列中的某个元素为界点,经过一次划分,将待排序元素分为左右两个子序列,左子序列元素的排列序列均小于界点元素的排序码,右子序列的排序码则大于或等于界点的排序码,而后分别对两个字序列继续进行划分,直至每个序列只有一个元素为止。
必定要认真啊,认真啊,认真啊!!! 代码实现:
//快速排序
public class QuickSort {
private static void swap(int[] data,int i,int j) {
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
private static void subSort(int[] data,int start,int end) {
if (start < end) {
int base = data[end];
int i = start;
int j = end + 1;
while(true) {
while(i < end && data[++i] <= base) ;
while(j > start && data[--j] >= base);
if (i > j) {
swap(data,i,j);
}else {
break;
}
}
swap(data, start, j);
subSort(data, start, j - 1);
subSort(data, j + 1, end);
}
}
public static void quickSort(int[] data) {
subSort(data,0,data.length - 1);
}
public static void main(String[] args) {
int[] data = {9,5,6,88};
quickSort(data);
System.out.print(java.util.Arrays.toString(data));
}
}
复制代码
基本思想:每次将一个待排序的元素,按其关键字的大小插入到前面已经排好序的子序的合适位置,直到所有记录插入完成。
* 插入算法.
* 1,从后向前找到合适的位置插入
* 基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排好的子序列的合适位置
* 直到所有插入为止
*/
public class InsertSort {
public static void main(String[] args) {
//待排序的数列
int[] nums = {43, 23, 64, 24, 34, 78, 32};
//控制比较的轮数
for (int i = 1; i < nums.length; i++) {
//记录操做数
int temp = nums[i];
int j = 0;
for (j = i - 1; j >= 0; j--) {
//后一个和前一个比较,若是前面的大,则把前面的赋值到后面。
if (nums[j] > temp) {
nums[j+1] = nums[j];
} else {
break;
}
}
if (nums[j + 1] != temp) {
nums[j + 1] = temp;
}
}
//输出结果
for(int n : nums) {
System.out.println(n);
}
}
}
复制代码
直接插入排序:
直接插入排序 的基本思想:把n个待排序的元素堪称为一个有序表和无序表,开始时有序表中只包含一个元素,无序表中有n-1个元素,排序过程当中每次从无序表中取出第一个元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
代码实现:
//直接插入排序
public class InsertSort {
public static void insertSort(int[] data) {
int arrayLength = data.length;
for (int i = 1; i < arrayLength; i++) {
int tmp = data[i];
if (data[i] < data[i -1]) {
int j = i - 1;
for (;j >=0 && data[j] > tmp; j-- ) {
data[j + 1] = data[j];
}
data[j + 1] = tmp;
}
}
}
public static void main(String[] args) {
int[] data = {5,2,6,9};
insertSort(data);
for (int d :data ) {
System.out.print(" " + d);
}
}
}
复制代码
代码实现:
//折半插入排序
public class BinaryInsertSort{
public static void binaryInsertSort(int[] data) {
int len = data.length;
for (int i = 1; i < len; i++) {
int tmp = data[i];
int low = 0;
int high = i - 1;
while(low <= high) {
int mid = (low + high) / 2;
if (tmp > data[mid]) {
low = mid + 1;
}
else {
high = mid -1;
}
}for (int j = i;j > low ; j-- ) {
data[j] = data[j - 1 ];
}
data[low] = tmp;
}
}
public static void main(String[] args) {
int[] data = {5,2,7,3,9};
binaryInsertSort(data);
for (int d : data) {
System.out.print(" " + d);
}
}
}
复制代码
/** * Created by guo on 2018/2/2. * 二分查找法(折半查找):前提是在已经排好序的数组中,经过将待查找的元素 * 与中间索引值对应的元素进行比较,若大于中间索引值对应的元素,去右半边查找, * 不然,去左边查找。依次类推。直到找到位置;找不到返回一个负数 */
public class BinarySearchSort {
public static void main(String[] args) {
//必须保证数列是有序的
int[] nums = {12, 32, 55, 67, 87, 98};
int i = binarySearch(nums, 87);
System.out.println("查找数的下标为:" + i); //输出下标为4
}
/** * 二分查找算法 * * @param nums * @param key * @return */
public static int binarySearch(int[] nums, int key) {
int start = 0; //开始下标
int end = nums.length - 1; //结束下标
while (start <= end) { //开始位置不能穿过结束位置 --start-->|<--end--
int middle = (start + end) / 2;
// 若是查找的key比中间的大,则去掉左边的值
if (key > nums[middle]) {
start = middle + 1;
//若是查找的key比中间的小,则去掉右边的。
} else if (key < nums[middle]) {
end = middle - 1; //结束位置须要向前移一位。
} else {
return middle;
}
}
//找不到则返回-1
return -1;
}
}
复制代码
先到这里吧,后续还得多敲几遍,须要学习的太多了,gogogo。