基本排序算法Java实现

1、冒泡排序:

/*冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。
 * 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
 * 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
 * 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
 * 
 * 冒泡排序对n个项目需要O(n^2)的比较次数,且可以原地排序。
 * 尽管这个算法是最简单了解和实现的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。
 * 
 * 冒泡排序是与插入排序拥有相等的运行时间,但是两种算法在需要的交换次数却很大地不同。
 * 在最好的情况,冒泡排序需要O(n^2)次交换,而插入排序只要最多O(n)交换。
 * 冒泡排序的实现(类似下面)通常会对已经排序好的数列拙劣地运行(O(n^2)),而插入排序在这个例子只需要O(n)个运算。
 * 因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。
 * 冒泡排序如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,也可以把最好的复杂度降低到O(n)。
 * 在这个情况,已经排序好的数列就无交换的需要。若在每次走访数列时,把走访顺序反过来,也可以稍微地改进效率。
 * 有时候称为鸡尾酒排序,因为算法会从数列的一端到另一端之间穿梭往返。
 * 
 * 冒泡排序算法的运作如下:
 * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
 * 针对所有的元素重复以上的步骤,除了最后一个。
 * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。*/

public class BubbleSort {
	public static void main(String [] args){
		int[] number = {95,45,15,78,84,51,24,12};
		for(int i=0;i<number.length-1;i++){
			for(int j=0;j<number.length-i-1;j++){
				if(number[j]>number[j+1]){
					int temp=number[j];
					number[j]=number[j+1];
					number[j+1]=temp;
				}
			}
		}
		for(int num:number){
			System.out.print(num+" ");
		}
	}
}

2、插入排序:

/*一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
 * 
 * 从第一个元素开始,该元素可以认为已经被排序
 * 取出下一个元素,在已经排序的元素序列中从后向前扫描
 * 如果该元素(已排序)大于新元素,将该元素移到下一位置
 * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
 * 将新元素插入到该位置后
 * 重复步骤2~5
 * 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。
 * 该算法可以认为是插入排序的一个变种,称为二分查找插入排序。*/
public class InsertionSort {
	public static void main(String[] args){
		int[] number = {95,45,15,78,84,51,24,12};
		for(int i=1;i<number.length;i++){
			int temp=number[i];
			int j=i;
			//短路,先比较j>0
			while(j>0&&number[j-1]>temp){
				number[j]=number[j-1];
				j--;
			}
			number[j]=temp;
			
		}
		for(int num:number){
			System.out.print(num+" ");
		}
	}
}
3、快速排序:

/*快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
 * 
 * 步骤为:
 * 从数列中挑出一个元素,称为"基准"(pivot),
 * 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
 * 在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
 * 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
 * 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。
 * 虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
*/
public class QuickSort {
	public static void main(String[] args){
		Integer[] number = {95,45,15,78,84,51,24,12};
		Comparator1 comparator1= new Comparator1();
		sort(number,comparator1);
		
		for(Integer num:number){
			System.out.print(num+"");
		}
	}
	
	public static final Random RND=new Random();
	
	private static void swap(Object[] array,int i,int j){
		Object temp=array[i];
		array[i]=array[j];
		array[j]=temp;
	}
	private static<E> int partition(E[]array,int begin,int end,Comparator<? super E> cmp){
		int index=begin+RND.nextInt(end-begin+1);
		E pivot=array[index];
		swap(array,index,end);
		for(int i=index=begin;i<end;i++){
			if(cmp.compare(array[i], pivot)<0){
				swap(array,index++,i);
			}
			
		}
		swap(array,index,end);
		return index;
	}
	private static<E> void qsort(E[] array,int begin,int end,Comparator<? super E> cmp){
		if(end>begin){
			int index=partition(array, begin, end, cmp);
			qsort(array,begin,index-1,cmp);
			qsort(array,index+1,end,cmp);
			
		}
	}
	public static<E> void sort(E[] array,Comparator<? super E> cmp){
		qsort(array,0,array.length-1,cmp);
	}
	
}
class Comparator1 implements Comparator<Integer>{

	@Override
	public int compare(Integer o1, Integer o2) {
		// TODO Auto-generated method stub
		if(o1<o2){
			return -1;
		}else if(o1>02){
			return 1;
		}
		return 0;
	}
}

4、选择排序:

public class SelectionSort {
	public static void main(String[] args){
		int[] number = {95,45,15,78,84,51,24,12};
		
		for(int i=0;i<number.length;i++){
			int maxnum=number[i];
			//
			int flag=i;
			for(int j=i;j<number.length;j++){
				if(maxnum<number[j]){
					maxnum=number[j];
					flag=j;
				}
			}
			number[flag]=number[i];
			number[i]=maxnum;
		}
		for(int num:number){
			System.out.print(num+" ");
		}
	}
}

5、归并排序:

实现的时候忘记将重新排序的数组返回,导致排序失败。

public class MergeSort {
	public static void main(String[] args){
		int[] number = {95,45,15,78,84,51,24,12,1};
		int[] result=mergeSort(number);
		for(int num:result){
			System.out.print(num+" ");
		}
	}
	private static int[] mergeSort(int [] arr){
		if(arr.length==1){
			return arr;
		}
		int half=arr.length/2;
		System.out.println("half:"+half);
		int [] arr1=new int[half];
		int [] arr2=new int[arr.length-half];
		
		System.arraycopy(arr, 0, arr1, 0, arr1.length);
		System.arraycopy(arr, half, arr2, 0, arr2.length);
		//
		System.out.print("arr1:");
		for(int arrr1:arr1){
			System.out.print(arrr1+" ");
		}
		System.out.println();
		System.out.print("arr2:");
		for(int arrr1:arr2){
			System.out.print(arrr1+" ");
		}
		System.out.println();
		//改变数组忘了传回来
		arr1=mergeSort(arr1);
		arr2=mergeSort(arr2);
		System.out.print("arr1+arr2 ");
		for(int arrr1:arr1){
			System.out.print(arrr1+" ");
		}
		for(int arrr1:arr2){
			System.out.print(arrr1+" ");
		}
		System.out.println();
		int[] result=mergeSortSub(arr1, arr2);
		System.out.print("re: ");
		for(int re:result){
			System.out.print(re+" ");
		}
		System.out.println();
		return result;
	}
	private static int[] mergeSortSub(int[] arr1,int[] arr2){
		int i=0,j=0,k=0;
		int[] result1=new int[arr1.length+arr2.length];
		while(i<arr1.length&&j<arr2.length){
			if(arr1[i]<arr2[j]){
				System.out.println("i:"+i);
				result1[k]=arr1[i];
				i=i+1;
			}else{
				System.out.println("j:"+j);
				result1[k]=arr2[j++];
			}
			System.out.println("k:"+k);
			k++;
		}
		for(;i<arr1.length;i++){
			System.out.println("i:"+i);
			result1[k++]=arr1[i];
		}
		for(;j<arr2.length;j++){
			System.out.println("j:"+j);
			result1[k++]=arr2[j];
		}
		return result1;
	}
}

6、计数排序



public class CountSort {
	public static void main(String[] args){
		int a[]={100,93,97,92,96,99,92,89,93,97,90,94,92,95};
		int[] b=countSort(a);
		for(int i:a){
			System.out.print(i+" ");
		}
		System.out.println();
		for(int i:b){
			System.out.print(i+" ");
		}
	}
	public static int[] countSort(int[] arr){
		int[] b=new int[arr.length];
		int max=arr[0];
		int min=arr[0];
		for(int i:arr){
			if(i>max){
				max=i;
			}
			if(i<min){
				min=i;
			}
		}
		//
		int k=max-min+1;
		int[] c=new int[k];
		/*for(int i:c){
			System.out.print(i);
		}
		System.out.println();*/
		for(int i=0;i<arr.length;i++){
			c[arr[i]-min]+=1;
		}
		/*for(int i:c){
			System.out.print(i+" ");
		}
		System.out.println();*/
		for(int i=1;i<c.length;i++){
			c[i]=c[i]+c[i-1];
		}
		/*for(int i:c){
			System.out.print(i+" ");
		}
		System.out.println();*/
		for(int i=arr.length-1;i>=0;--i){
			b[--c[arr[i]-min]]=arr[i];
		}
		return b;
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以通过直接插入排序、希尔排序和堆排序来实现排序算法。 直接插入排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class InsertSortDemo { public static void insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j > key) { arr[j + 1 = arr[j]; j--; } arr[j + 1 = key; } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); insertSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 希尔排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class ShellSortDemo { public static void shellSort(int[] arr) { int n = arr.length; for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int key = arr[i]; int j = i; while (j >= gap && arr[j - gap > key) { arr[j = arr[j - gap]; j -= gap; } arr[j = key; } } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); shellSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 堆排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class HeapSortDemo { public static void heapSort(int[] arr) { int n = arr.length; // 构建大顶堆 for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // 依次将堆顶元素与末尾元素交换,并重新构建堆 for (int i = n - 1; i > 0; i--) { int temp = arr = arr[i]; arr[i = temp; heapify(arr, i, 0); } } public static void heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left > arr[largest]) { largest = left; } if (right < n && arr[right > arr[largest]) { largest = right; } if (largest != i) { int temp = arr[i]; arr[i = arr[largest]; arr[largest = temp; heapify(arr, n, largest); } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); heapSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 以上是三种常见排序算法Java实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java实现七种经典排序算法](https://blog.csdn.net/qq_27498287/article/details/126049089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值