常用排序算法总结java实现(一)

目录

1.直接插入排序

2 希尔排序

3 冒泡排序


1.直接插入排序

1.1 描述

直接插入排序是一种稳定的排序算法。

直接插入排序是插入排序中最简单直接的算法,是将待排序序列中的每一个元素依次插入到排好序的序列中,类似于整理纸牌的过程。例如待排序序列:【25,8,16,21,10】

第一次:【8,25,16,21,10】

第二次:【8,16,25,21,10】

第三次:【8,16,21,25,10】

第四次:【8,10,16,21,25

1.2 算法过程

  1. 把序列第一个元素看作已排好序部分,从第二个元素开始,为待排序部分;

  2. 取出待排序部分的第一个元素,与排好序部分从后往前依次比较;

  3. 若取出的元素<排序元素,把记录后移一位,继续该步骤直到取出的元素>排序元素为止;

  4. 在此位置插入取出的元素;

  5. 重复2

1.3 代码实现

import java.util.*;

public class InsertSort {
	public static void InsertSorttest(int s[]) {
        //从第二个元素开始,与排好序元素依次比较
		for(int i=1;i < s.length; i++) {
			int temp=s[i];                //待排序元素的暂存单元temp
			int j=i-1;
			while((j>=0) && temp<s[j] ) {    //依次比较排好序的直到不满足条件
				s[j+1]=s[j];
				j--;
			}
			s[j+1]=temp;                      //将待排序元素插入到当前位置
		}
		System.out.print(Arrays.toString(s));
	}
	
	public static void main(String str[]) {
		int[] x= {25,8,16,21,10};
		InsertSorttest(x);
	}
}

输出:【8,10,16,21,25】

1.4 算法效率

最好情况:序列为正序,时间复杂度为O(N)

最好情况:序列为逆序,时间复杂度为O(N^2)

平均情况:时间复杂度为O(N^2)

 

2 希尔排序

2.1 描述

希尔排序是不稳定的算法。

也利用了直接插入排序,适用于当整个序列不基本有序时。主要思想是把整个序列划分为好几个子序列,在子序列中完成直接插入排序,当整个序列基本有序时,再对整个序列进行直接插入排序。

2.2 算法过程

  1. 若待排序记录为n个
  2. 设按间隔为d=n/2设置子序列,相距为d的为一组子序列。
  3. 从第d+1个记录开始插入,与其子序列中另一个记录(第前d个)进行直接插入排序
  4. 缩小d=d/2,重复3

3.3 代码实现

import java.util.Arrays;

public class ShellSort {
	public static void shellsorttest(int s[]) {
		int n=s.length;
//		d为间隔
		for(int d=n/2;d>=1;d=d/2) {
//			前n个记录为d个子序列的第一个记录,从d+1个记录开始插入,数组中表示为d
			for(int i=d;i<n;i++) {
				int temp=s[i];
				int j=i-d;		//与i的第前d个比较
				while(j>=0 && temp<s[j]) {
//					若当前插入元素小于s[j],则记录后移d
					s[j+d]=s[j];
					j=j-d;
				}
				s[j+d]=temp;
			}
		}
		System.out.print(Arrays.toString(s));
	}

	public static void main(String[] args) {
		int[] x= {3,6,4,8,1,10};
		shellsorttest(x);
	}

}

2.4 算法效率

时间复杂度:O(N^2)~O(Nlog2n)

 

3 冒泡排序

3.1 描述

冒泡排序是一种稳定的排序算法。

采用两两比较,大的记录后移即交换位置,就像水里的气泡,最大的先冒出来。

3.2 算法过程

  1. 将序列划分为有序区和无序区,有序区初始时为空,无序区为整个序列。
  2. 对无序区从前往后将相邻的两个元素依次比较,若为反序则交换双方位置,重复该步骤至无序区没有反序为止。

3.3 代码实现

import java.util.*;
public class BubbleSort {
	public static void bubblesort(int s[],int n) {
		int k;
		int flag=n;			//flag为无序区边界
		
		while(flag>0) {
			k=flag;
			flag=0;        //若无交换,则flag=0,结束
			
			for(int i=1;i<k;i++) {
//				反序则交换位置
				if(s[i]<s[i-1]) {
					int temp=s[i-1];
					s[i-1]=s[i];
					s[i]=temp;
				}
				flag=i;		//交换的位置	
			}
		}
		System.out.print(Arrays.toString(s));
	}
	
	public static void main(String str[]) {
		int[] x= {3,6,4,8,1,10};
		bubblesort(x,6);
	}
}

3.4 算法效率

最好情况:序列为正序,时间复杂度为O(n)

最坏情况:为逆序,时间复杂度O(n^2)

平均情况:时间复杂度为O(n^2)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常见的排序算法有许多种,以下是一些常见的排序算法Java实现示例: 1. 冒泡排序(Bubble Sort): ```java public void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换arr[j]和arr[j+1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 插入排序(Insertion Sort): ```java public void insertionSort(int[] arr) { int n = arr.length; for (int i = 1; i < n; ++i) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } ``` 3. 选择排序(Selection Sort): ```java public void selectionSort(int[] arr) { int n = arr.length; for (int i = 0; i < n-1; i++) { int minIndex = i; for (int j = i+1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } // 交换arr[i]和arr[minIndex] int temp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = temp; } } ``` 4. 快速排序(Quick Sort): ```java public void quickSort(int[] arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } private int partition(int[] arr, int low, int high) { int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; // 交换arr[i]和arr[j] int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 交换arr[i+1]和arr[high] int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; } ``` 这些只是一些常见的排序算法的示例,还有其他排序算法,如归并排序、堆排序等。你可以根据需要选择适合的排序算法进行实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值