简单排序算法(java实现)

简单排序算法(java实现)

        开始进行java数据结构与算法方面的学习,将所学过程记录下来以方便自己以后再次翻看,也希望能和同在学习的朋友们一起交流学习心得。好了,废话不多说了,开始自己得正文了,由于今天是第一天,就从简单排序算法开始。

一、简单排序算法分类

1、冒泡排序:重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,所以叫“冒泡排序”。

 冒泡排序算法的原理如下(从小到大):

  1. 比较相邻的元素。如果前一个值比后一个值大,就交换他们两个位置。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public class BubbleSort {
   
	public static void sort(long[]arr) {
		long temp = 0;
		for(int i=0;ii;j--) { 
				if(arr[j] < arr[j-1]) {  //判断后一个值是否小于前一个值
			        temp = arr[j];           //进行数据交换
			        arr[j] = arr[j-1];
			        arr[j-1] = temp;	
				}
			}
		}
	}
}
//测试主类
public class TestDemo{
	public static void main(String[] args) {
		long[] arr = new long[] {29,10,28,67,9,234};
		System.out.print("[");
		for(long num : arr) {  //输出未排序数组
			System.out.print(num + " ");
		}
		System.out.print("]");
		System.out.println();
		
		BubbleSort.sort(arr);   //调用冒泡排序方法
		
		System.out.print("[");
		for(long num : arr) {   //输出排序后数组
			System.out.print(num + " ");
		}
		System.out.print("]");
		System.out.println();
	}
}

说明:将冒泡排序方法单独写在BubbleSort类中,通过主类调用其中的排序方法,这样可以方便以后需要使用排序算法是直接调用BubbleSort类中的sort方法即可。

2、选择排序:从需要排序的数组中选出最小的(或者最大的)数字放在第一位,直到排序完成。

实现原理:从需要排序的数组中选择一个数字,与数组中的其他数字进行比较,如果有比它大得就是用比它大的那个数字继续进行比较,遍历一边数组后得到一个最大或者最小值,放在第一位,依次选择,直到排序完成。

public class SelectionSort {
    public static void sort(long[]arr) {
    	int k = 0;
    	long temp = 0;   
    	for(int i = 0; i

说明:此程序中i指向无序区的开始位置,以j为扫描指针在当前无序区arr[i ....n]中选出值最小的记录在arr[k],k记下当前找到最小值的位置,然后交换arr[i]和arr[k]。测试时只需将测试主类中的BubbleSort.sort(arr);调用方法改为Selection.sort(arr);即可进行测试。

3、插入排序:就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。    

实现原理:

1、将指针指向某个元素,假设该元素左侧的元素全部有序,将该元素抽取出来,然后按照从右往左的顺序分别与其左边的元素比较,遇到比其大的元素便将元素右移,直到找到比该元素小的。

2、此时会出现一个空位,将该元素放入到空位中,此时该元素左侧的元素都比它小,右侧的元素都比它大;元素或者找到最左面发现其左侧的元素都比它大,停止;

3、指针向后移动一位,重复上述过程。每操作一轮,左侧有序元素都增加一个,右侧无序元素都减少一个。

public class InsertSort {
     public static void sort(long[]arr) {
    	 long temp = 0;
    	 for(int i = 1;i=0 && arr[j] >= temp) {//当比到最左边或者遇到比temp小的数据时,结束循环
    		 arr[j + 1] = arr[j];         //对数据进行右移
    		 j--;
    	     }
    		 arr[j+1] = temp;             //将值放在空位上
    	 }
     }
}

程序说明:1、以数组的某一位作为分隔位,比如i=1,假设左侧的都是有序的。2、将i位的数据拿出来,放到临时变量里,这时i位置就空出来了。3、从j=i-1开始将左面的数据与当前i位的数据(即temp)进行比较,如果arr[j]>temp,  则将arr[j]后移一位,即arr[j+1]=arr[j],此时j就空出来了。 4、再用i-2(即j=j-1)位的数据和temp比,重复步骤3, 直到找到<=temp的数据或者比到了最左面(说明temp最小),停止比较,将temp放在当前空的位置上. 5、i向后挪1,即i=i+1,temp=arr[i],重复步骤2-4,直到i=arr.length,排序结束, 此时数组中的数据即为从小到大的顺序。

你可能感兴趣的:(简单排序算法(java实现))