IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 常见的排序算法——选择排序,冒泡排序,插入排序,快速排序,归并排序 -> 正文阅读

[数据结构与算法]常见的排序算法——选择排序,冒泡排序,插入排序,快速排序,归并排序

太久没看代码了,最近打算复习一下java,又突然想到了排序算法,就把几种常见的排序算法用java敲了一遍,这里统一将无序的序列从小到大排列。

选择排序
选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小元素,继续放在下一个位置,直到待排序元素个数为0。

选择排序代码如下:

	public void Select_sort(int[]  arr) {
		int temp,index;
		for( int i=0;i<10;i++) {
			index = i;
			for(int j = i + 1 ; j < 10 ; j++) {
				if(arr[j] < arr[index])
					index = j;
			}
			/*
			temp = arr[i];
			arr[i] = arr[index];
			arr[index] = temp;
			*/
			swap(arr,i,index);
		}
		System.out.print("经过选择排序后:");
		for(int i = 0 ; i < 10 ; i++)
			System.out.print( arr[i] +" ");
		System.out.println("");
	}

冒泡排序
冒泡排序是一种比较基础的排序算法,其思想是相邻的元素两两比较,较大的元素放后面,较小的元素放前面,这样一次循环下来,最大元素就会归位,若数组中元素个数为n,则经过(n-1)次后,所有元素就依次从小到大排好序了。整个过程如同气泡冒起,因此被称作冒泡排序。

选择排序代码如下:

public void Bubble_sort(int[] arr) {
		int temp;
		for(int i = 0 ; i < 9 ; i++) {
			for(int j = 0 ; j < 10 - i - 1 ;j++) {
				if(arr[j] > arr[j+1]) {
					/*
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
					*/
					swap(arr,j,j+1);
				}
			}
		}
		System.out.print("经过冒泡排序后:");
		for(int i = 0 ; i < 10 ; i++)
			System.out.print( arr[i] +" ");
		System.out.println("");
	}

插入排序
插入排序也是一种常见的排序算法,插入排序的思想是:创建一个与待排序数组等大的数组,每次取出一个待排序数组中的元素,然后将其插入到新数组中合适的位置,使新数组中的元素保持从小到大的顺序。

插入排序代码如下:

	public void Insert_sort(int[] arr) {
		int length = arr.length;
		int[] arr_sort = new int[length];
		int count = 0;
		for(int i = 0;i < length; i++) {
			if(count == 0) {
				arr_sort[0] = arr[0];
			}else if(arr[i] >= arr_sort[count - 1]) {
				arr_sort[count] = arr[i];
			}else if(arr[i] < arr_sort[0]) {
				insert(arr,arr_sort,arr[i],0,count);
			}else {
				for(int j = 0;j < count - 1; j++) {
					if(arr[i] >= arr_sort[j] && arr[i] < arr_sort[j+1]) {
						insert(arr,arr_sort,arr[i],j+1,count);
						break;
					}
				}
			}
			count++;
		}
		System.out.print("经过插入排序后:");
		for(int i = 0 ; i < 10 ; i++)
			System.out.print( arr_sort[i] +" ");
		System.out.println("");
	}
	public void insert(int[] arr,int[] arr_sort,int value,int index,int count) {
		for(int i = count; i > index; i--)
			arr_sort[i] = arr_sort[i-1];
		arr_sort[index] = value;
	}

快速排序
快速排序的效率比冒泡排序算法有大幅提升。因为使用冒泡排序时,一次外循环只能归位一个值,有n个元素最多就要执行(n-1)次外循环。而使用快速排序时,一次可以将所有元素按大小分成两堆,也就是平均情况下需要logn轮就可以完成排序。
快速排序的思想是:每趟排序时选出一个基准值(这里以首元素为基准值),然后将所有元素与该基准值比较,并按大小分成左右两堆,然后递归执行该过程,直到所有元素都完成排序。

	public void Quick_sort(int[] arr, int left, int right) {
		if(left >= right) 
			return ;
		
		int temp,t;
		int j = right;
		int i = left;
		temp = arr[left];
		while(i < j) {
			while(arr[j] >= temp && i < j)
				j--;
			while(arr[i] <= temp && i < j)
				i++;
			if(i < j) {
				t = arr[i];
				arr[i] = arr[j];
				arr[j] = t;
			}
		}
		arr[left] = arr[i];
		arr[i] = temp;
		
		Quick_sort(arr,left, i - 1);
		Quick_sort(arr, i + 1, right);
	}

归并排序
归并排序是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,每两个小分组合并成一个大的分组,逐层进行,最终所有的元素都是有序的。

	public void Mergesort(int[] arr,int left,int right) {
		if(right - left > 0) {
			int[] arr_1 = new int[(right - left)/2 + 1];
			int[] arr_2 = new int[(right - left + 1)/2];
			int j = 0;
			int k = 0;
			for(int i = left;i <= right;i++) {
				if(i <= (right + left)/2) {
					arr_1[j++] = arr[i];
				}else {
					arr_2[k++] = arr[i];
				}
			}
			Mergesort(arr_1,0,(right - left)/2);
			Mergesort(arr_2,0,(right - left - 1)/2);
			Merge(arr_1,arr_2,arr);
		}
	}
	public void Merge(int[] arr_1,int[] arr_2,int[] arr) {
		int i = 0;
		int j = 0;
		int k = 0;
		int L1 = arr_1.length;
		int L2 = arr_2.length;
		while(i < L1 && j < L2) {
			if(arr_1[i] <= arr_2[j]) {
				arr[k] = arr_1[i];
				i++;
			}else {
				arr[k] = arr_2[j];
				j++;
			}
			k++;
		}
		if(i == L1) {
			for(int t = j;j < L2;j++)
				arr[k++] = arr_2[j];
		}else {
			for(int t = i;i < L1;i++)
				arr[k++] = arr_1[i];
		}
	}

归并排序这里我使用了left,right等变量,使其可以通用,并没有直接用数字表示那么明确,所以给出相关伪代码,便于理解。

Mergesort(arr[0...n-1])
	//输入:一个可排序数组arr[0...n-1]
	//输出:非降序排列的数组arr[0...n-1]
	if n>1
		copy arr[0...n/2-1] to arr_1[0...(n+1)/2-1]//确保arr_1中元素个数>=arr_2中元素个数
		//对于总个数为奇数时,arr_1比arr_2中元素多一个;对于总个数为偶数时,没有影响
		copy arr[n/2...n-1] to arr_2[0...n/2-1]
		Mergesort(arr_1[0...(n+1)/2-1])
		Mergesort(arr_2[0...n/2-1])
		Merge(arr_1,arr_2,arr)

Merge(arr_1[0...p-1],arr_2[0...q-1],arr[0...p+q-1])
	//输入:两个有序数组arr_1[0...p-1]和arr_2[0...q-1]
	//输出:将arr_1与arr_2两数组合并到arr
	int i<-0;j<-0;k<-0
	while i<p and j<q do
		if arr_1[i] <= arr_2[j]
			arr[k] <- arr_1[i]
			i<-i+1
		else arr[k] <- arr_2[j];j<-j+1
		k<-k+1
	if i=p
		copy arr_2[j...q-1] to arr[k...p+q-1]
	else copy arr_1[i...p-1] to arr[k...p+q-1]

最后,完整代码如下:

package test_1;

import java.util.Scanner;

public class Test01 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] arr_1 = new int[10];
		for(int i = 0 ; i < 10 ; i++)
			arr_1[i] = sc.nextInt();
		Sort demo_1 = new Sort();
		
		//1~5一次只能运行一个,若多个同时运行,则只有第一个有效,后面几个是无效排序。因为第一个运行的已经将带排序数组排好序。
		
		demo_1.Select_sort(arr_1);//-----------------------1
		
		//demo_1.Bubble_sort(arr_1);//---------------------2
		
		/*							//---------------------3
		demo_1.Quick_sort(arr_1, 0 , arr_1.length - 1);
		System.out.print("经过快速排序后:");
		for(int i = 0 ; i < 10 ; i++)
			System.out.print( arr_1[i] +" ");
		System.out.println("");
		*/
		
		//demo_1.Insert_sort(arr_1);//--------------------4
		
		/*							//--------------------5
		demo_1.Mergesort(arr_1,0,arr_1.length - 1);
		System.out.print("经过归并排序后:");
		for(int i = 0 ; i < 10 ; i++)
			System.out.print( arr_1[i] +" ");
		System.out.println("");
		*/
	}
}

class Sort {
	public void swap(int arr[],int a, int b) {
		int t;
		t = arr[a];
		arr[a] = arr[b];
		arr[b] = t;
	}
	
	public void Select_sort(int[]  arr) {
		int temp,index;
		for( int i=0;i<10;i++) {
			index = i;
			for(int j = i + 1 ; j < 10 ; j++) {
				if(arr[j] < arr[index])
					index = j;
			}
			/*
			temp = arr[i];
			arr[i] = arr[index];
			arr[index] = temp;
			*/
			swap(arr,i,index);
		}
		System.out.print("经过选择排序后:");
		for(int i = 0 ; i < 10 ; i++)
			System.out.print( arr[i] +" ");
		System.out.println("");
	}
	
	public void Bubble_sort(int[] arr) {
		int temp;
		for(int i = 0 ; i < 9 ; i++) {
			for(int j = 0 ; j < 10 - i - 1 ;j++) {
				if(arr[j] > arr[j+1]) {
					/*
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
					*/
					swap(arr,j,j+1);
				}
			}
		}
		System.out.print("经过冒泡排序后:");
		for(int i = 0 ; i < 10 ; i++)
			System.out.print( arr[i] +" ");
		System.out.println("");
	}
	
	public void Quick_sort(int[] arr, int left, int right) {
		if(left >= right) 
			return ;
		
		int temp,t;
		int j = right;
		int i = left;
		temp = arr[left];
		while(i < j) {
			while(arr[j] >= temp && i < j)
				j--;
			while(arr[i] <= temp && i < j)
				i++;
			if(i < j) {
				t = arr[i];
				arr[i] = arr[j];
				arr[j] = t;
			}
		}
		arr[left] = arr[i];
		arr[i] = temp;
		
		Quick_sort(arr,left, i - 1);
		Quick_sort(arr, i + 1, right);
	}
	
	public void Insert_sort(int[] arr) {
		int length = arr.length;
		int[] arr_sort = new int[length];
		int count = 0;
		for(int i = 0;i < length; i++) {
			if(count == 0) {
				arr_sort[0] = arr[0];
			}else if(arr[i] >= arr_sort[count - 1]) {
				arr_sort[count] = arr[i];
			}else if(arr[i] < arr_sort[0]) {
				insert(arr,arr_sort,arr[i],0,count);
			}else {
				for(int j = 0;j < count - 1; j++) {
					if(arr[i] >= arr_sort[j] && arr[i] < arr_sort[j+1]) {
						insert(arr,arr_sort,arr[i],j+1,count);
						break;
					}
				}
			}
			count++;
		}
		System.out.print("经过插入排序后:");
		for(int i = 0 ; i < 10 ; i++)
			System.out.print( arr_sort[i] +" ");
		System.out.println("");
	}
	public void insert(int[] arr,int[] arr_sort,int value,int index,int count) {
		for(int i = count; i > index; i--)
			arr_sort[i] = arr_sort[i-1];
		arr_sort[index] = value;
	}
	
	public void Mergesort(int[] arr,int left,int right) {
		if(right - left > 0) {
			int[] arr_1 = new int[(right - left)/2 + 1];
			int[] arr_2 = new int[(right - left + 1)/2];
			int j = 0;
			int k = 0;
			for(int i = left;i <= right;i++) {
				if(i <= (right + left)/2) {
					arr_1[j++] = arr[i];
				}else {
					arr_2[k++] = arr[i];
				}
			}
			Mergesort(arr_1,0,(right - left)/2);
			Mergesort(arr_2,0,(right - left - 1)/2);
			Merge(arr_1,arr_2,arr);
		}
	}
	public void Merge(int[] arr_1,int[] arr_2,int[] arr) {
		int i = 0;
		int j = 0;
		int k = 0;
		int L1 = arr_1.length;
		int L2 = arr_2.length;
		while(i < L1 && j < L2) {
			if(arr_1[i] <= arr_2[j]) {
				arr[k] = arr_1[i];
				i++;
			}else {
				arr[k] = arr_2[j];
				j++;
			}
			k++;
		}
		if(i == L1) {
			for(int t = j;j < L2;j++)
				arr[k++] = arr_2[j];
		}else {
			for(int t = i;i < L1;i++)
				arr[k++] = arr_1[i];
		}
	}
}


若有错误,麻烦指正,不胜感激。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 17:56:08  更:2021-12-16 17:56:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/30 12:19:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码