几个简单的排序算法(java版)

前言

几个简单的排序算法(java版),这里主要介绍冒泡算法、选择排序、插入排序算法及简单的java代码实现。

内容

1.   冒泡排序算法

冒泡排序是最简单的排序算法,基本的算法思想:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

算法步骤如下:

1)  假设有待排序的队列元素N个;

2)  设置参数out = N-1 ;

3)  设置参数 i = 0;

4)  将Ni(第i个元素)与Ni+1(第i+1个元素)作比较,如果Ni>Ni+1则交换位置;

5)  i加1,重复4)步,直到i= out – 1;

6)  置out = N – 2,重复3)、4)、5)步骤,直到out = 1,算法结束;

java实现代码如下:

package learn.sort;
/**
* @Description: 冒泡排序
* @author 柯颖波
* @date Jul 31, 2013 3:25:46 PM 
* @version v1.0
 */
public class BubbleSort {
	private int datas[];// 存放排序数的数组
	private int index;// 数组索引

	public BubbleSort(int max) {
		datas = new int[max];
		index = 0;
	}

	// 插入单个数据
	public void insertData(int data) {
		datas[index++] = data;
	}

	// 打印数组
	public void display() {
		for (int i = 0; i < index; i++) {
			System.out.print(" " + datas[i]);
		}
		System.out.println("");
	}

	// 执行排序,指定升序或降序
	public void sort() {
		for (int i = index - 1; i > 0; i--) {
			for (int j = 0; j < i; j++) {
				if (datas[j] > datas[j + 1]) {
					int temp = datas[j];
					datas[j] = datas[j + 1];
					datas[j + 1] = temp;
				}
			}
		}
	}

	public static void main(String[] args) {
		BubbleSort arr = new BubbleSort(10);
		arr.insertData(2);
		arr.insertData(3);
		arr.insertData(5);
		arr.insertData(6);
		arr.insertData(1);
		arr.insertData(8);
		arr.insertData(6);
		arr.insertData(6);
		arr.insertData(9);
		
		System.out.println("排序前:");
		arr.display();
		arr.sort();
		System.out.println("排序后:");
		arr.display();
	}
}

2.   选择排序算法

选择排序的算法思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。

算法步骤如下:

1)  假设有待排序的队列元素N个;

2)  设置参数out = N-1 ;

3)  设置参数 i = 0;

4)  设置参数 max = Ni,maxIndex = I;

5)  将Ni(第i个元素)与Ni+1(第i+1个元素)作比较,如果Ni+1>Ni则max =Ni+1;maxIndex = i+1;

6)  in加1,重复5)步,直到i = out – 1则N(out)与N(maxIndex)元素作交换;

7)  置out = N – 2,重复3)、4)、5)步骤,直到out = 1,算法结束;

java实现代码如下:

package learn.sort;
/**
* @Description: 选择排序
* @author 柯颖波
* @date Jul 31, 2013 3:25:46 PM 
* @version v1.0
 */
public class SelectionSort {
	private int datas[];// 存放排序数的数组
	private int index;// 数组索引

	public SelectionSort(int max) {
		datas = new int[max];
		index = 0;
	}

	// 插入单个数据
	public void insertData(int data) {
		datas[index++] = data;
	}

	// 打印数组
	public void display() {
		for (int i = 0; i < index; i++) {
			System.out.print(" " + datas[i]);
		}
		System.out.println("");
	}

	// 执行排序,指定升序或降序
	public void sort() {
		for (int i = index - 1; i > 0; i--) {
			int max = datas[i];
			int maxindex = i;
			for (int j = 0; j < i; j++) {
				if (datas[j] > max) {
					max = datas[j];
					maxindex = j;
				}
			}
			datas[maxindex] = datas[i];
			datas[i] = max;
		}
	}

	public static void main(String[] args) {
		SelectionSort arr = new SelectionSort(10);
		arr.insertData(2);
		arr.insertData(3);
		arr.insertData(5);
		arr.insertData(6);
		arr.insertData(1);
		arr.insertData(8);
		arr.insertData(6);
		arr.insertData(6);
		arr.insertData(9);
		
		System.out.println("排序前:");
		arr.display();
		arr.sort();
		System.out.println("排序后:");
		arr.display();
	}
}

3.   插入排序算法

插入排序算法思想:将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置。

算法步骤:

1)  从有序数列和无序数列{a2,a3,…,an}开始进行排序;

2)  ⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;

3)  ⒊重复第二步,共进行n-i次插入处理,数列全部有序。

java实现代码如下:

package learn.sort;

import java.util.Random;

import sun.misc.Sort;

import com.sun.rsasign.a0;

/**
 * @Description: 插入排序
 * @author 柯颖波
 * @date Jul 31, 2013 3:25:46 PM
 * @version v1.0
 */
public class InsertSort {
	private int datas[];// 存放排序数的数组
	private int index;// 数组索引

	public InsertSort(int max) {
		datas = new int[max];
		index = 0;
	}

	// 插入单个数据
	public void insertData(int data) {
		datas[index++] = data;
	}

	// 打印数组
	public void display() {
		for (int i = 0; i < index; i++) {
			System.out.print(" " + datas[i]);
		}
		System.out.println("");
	}

	// 执行排序
	public void sort() {
		// 方式1
		/*for (int i = 1; i < index; i++) {
			int insertIndex = i;
			int temp = datas[i];
			for (int j = 0; j < i; j++) {
				if (datas[j] > datas[i]) {
					insertIndex = j;
					break;
				}
			}
			for (int j = i; j > insertIndex; j--) {
				datas[j] = datas[j - 1];
			}
			datas[insertIndex] = temp;
		}*/
		// 方式2
		for (int i = 1; i < index; i++) {
			int insertIndex = i;
			int temp = datas[i];
			while (insertIndex > 0 && datas[insertIndex - 1] > temp) {
				datas[insertIndex] = datas[insertIndex - 1];
				//System.out.println("交换");
				insertIndex--;
			}
			datas[insertIndex] = temp;
		}
	}

	public static void main(String[] args) {
		int max = 100;
		InsertSort arr = new InsertSort(max);
		for (int i = 0; i < max; i++) {
			arr.insertData((int)Math.random()*(max -1));
		}
		arr.sort();
		arr.display();
		System.out.println("end");
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值