`

数据结构和算法-排序

阅读更多

一、简单排序

1.冒泡排序O(n^2)

两两比较,反序交换

public static int[] bubbleSort(int[] arr) {
	for (int i = 0; i < arr.length - 1; i++) {
		for (int j = 0; j < arr.length - i - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				arr[j]   = arr[j] ^ arr[j+1];
				arr[j+1] = arr[j] ^ arr[j+1];
				arr[j]   = arr[j] ^ arr[j+1];
			}
		}
	}
	return arr;
}

2.选择排序O(n^2)

public static int[] selectSort(int[] arr) {
		int minIndex = -1;
		for (int i = 0; i < arr.length - 1; i++) {
			minIndex = i;
			for (int j = i + 1; j < arr.length; j++) {
				if(arr[minIndex] > arr[j]) {
					minIndex = j;
				}
			}
			if(i != minIndex) {
				arr[i]        = arr[minIndex] ^ arr[i];
				arr[minIndex] = arr[minIndex] ^ arr[i];
				arr[i]        = arr[minIndex] ^ arr[i];
			}
		}
		return arr;
	}

3.插入排序

将一个记录插入到已经排好序的有序表中得到一个新的、记录增1的有序表

public static int[] insertSort(int[] arr) {
		int sentinel;
		int index = -1;
		for (int i = 1; i < arr.length; i++) {
			sentinel = arr[i];
			if(arr[i] < arr[i - 1]) {
				// loop compare
				for (int j = 0; j < i; j++) {
					if(arr[i] < arr[j]) {
						index = j;
						break;
					}
				}
				// move
				for (int k = i; k > index; k--) {
					arr[k]   = arr[k] ^ arr[k-1];
					arr[k-1] = arr[k] ^ arr[k-1];
					arr[k]   = arr[k] ^ arr[k-1];
				}
				arr[index] = sentinel;
			}
		}
		return arr;
	}

二、复杂排序

1.希尔排序O(n^(3/2))

增量序列最后一个增量值必须等于1,初次取序列的一半为增量,以后每次减半,使序列基本有序,直到增量为1。

不实现了,在直接排序的基础上增加了一个增量,序列的增量比较。

 

2.堆排序O(nlogn)

是在选择排序基础上的改进,将序列构建成一个大顶堆,将堆顶元素移走,再将剩下的元素重新构建一个堆

堆:完全二叉树,节点大于或等于其左右节点的值称为大顶堆,小于或等于称为小顶堆

public static int[] heapSort(int[] arr) {
		int len = arr.length;
		// 构建大顶堆
		for (int i = len / 2; i > 0 ; i--) {
			adjustHeap(arr, i-1, len);
		}
		
		for (int i = len - 1; i > 0; i--) {
			// 将堆顶数据与最后一个数据交换
			arr[0] = arr[0] ^ arr[i];
			arr[i] = arr[0] ^ arr[i];
			arr[0] = arr[0] ^ arr[i];
			
			adjustHeap(arr, 0, i);
		}
		return arr;
	}
	
	// 调整堆结构
	public static int[] adjustHeap(int[] arr, int curInd, int len) {
		int tmp = arr[curInd];
		// 当前节点与其自节点比较交换 子节点:2*curIndex 2*curIndex+1 
		for(int i = (curInd + 1) * 2; i <= len; i++) {
			// 判断左右节点大小,将i设置为较大值index
			if (i < len && arr[i-1] < arr[i]) {
				++i;
			}
			
			// 父节点与较大子节点比较
			if (arr[curInd] > arr[i-1]) {
				break;
			}
			arr[curInd] = arr[curInd] ^ arr[i-1];
			arr[i - 1]  = arr[curInd] ^ arr[i-1];
			arr[curInd] = arr[curInd] ^ arr[i-1];
			curInd = i - 1;
		}
		arr[curInd] = tmp;
		return arr;
	}

 

 3.归并排序

用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列

 

public static int[] mergeSort(int[] arr, int first, int last) {
		if ((first + 1) < last) {
			int mid = (first + last) / 2;
			mergeSort(arr, first, mid);
			mergeSort(arr, mid, last);
			merge(arr, first, mid, last);
		}
		return arr;
	}
	
	public static void merge(int[] arr, int first, int mid, int last) {
		int[] tmp = new int[last - first];
		int indexL = first, indexR = mid, index = 0;
		
		while(indexL < mid && indexR < last) {
			if (arr[indexL] < arr[indexR]) {
				tmp[index] = arr[indexL];
				indexL ++;
			} else {
				tmp[index] = arr[indexR];
				indexR ++;
			}
			index ++;
		}
		
		while (indexL < mid) {
			tmp[index] = arr[indexL];
			index ++;
			indexL ++;
		}
		
		while (indexR < last) {
			tmp[index] = arr[indexR];
			index ++;
			indexR ++;
		}
		
		index = 0;
		for (int i = first; i < last; i++) {
			arr[i] = tmp[index];
			index ++;
		}
		
	}

 

 4.快速排序O(nlogn)

经过一次排序分割成2部分,一部分大于另一部分

public static int[] quickSort(int[] arr, int low, int high) {
		int privot;
		if (low < high) {
			privot = partition(arr, low, high);
			quickSort(arr, low, privot - 1);
			quickSort(arr, privot + 1, high);
		}
		return arr;
	}

	public static int partition(int[] arr, int low, int high) {
		int privotKey = arr[low];
		while (low < high) {
			while (low < high && privotKey <= arr[high]) {
				high--;
			}
			swap(arr, low, high);
			while (low < high && privotKey >= arr[low]) {
				low++;
			}
			swap(arr, low, high);
		}
		return low;
	}

	public static void swap(int[] arr, int i1, int i2) {
		if (i1 != i2) {
			arr[i1] = arr[i1] ^ arr[i2];
			arr[i2] = arr[i1] ^ arr[i2];
			arr[i1] = arr[i1] ^ arr[i2];
		}
	}

 优化:随机选取、三数取中

分享到:
评论

相关推荐

    数据结构和算法-思维导图.pdf

    在数据结构和算法领域中,存在大量不同的概念和术语,这些都构成了计算机科学的基础。思维导图是一种有效的方式来组织和回顾这些概念,通过可视化方式帮助记忆和理解。从提供的文件【标题】:"数据结构和算法-思维...

    数据结构与算法-PPT课件

    数据结构与算法是计算机科学中的核心课程,它探讨如何有效地组织和处理数据,以及如何设计和分析解决问题的算法。这份“数据结构与算法-PPT课件”提供了丰富的学习材料,涵盖了多个关键主题。 首先,我们要了解数据...

    Java数据结构和算法-带书签目录扫描版

    《Java数据结构和算法-带书签目录扫描版》是一本深入探讨Java编程语言中数据结构和算法的书籍。此扫描版特别包含了完整的书签目录,使得读者在电子版阅读时能够快速定位到所需章节,提高了学习和查阅的效率。 在...

    数据结构与算法 -电子教案

    数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。这份"数据结构与算法 -电子教案"无疑是学生们深入学习这一领域的宝贵资源。以下是对其中可能包含的知识点的详细阐述: 1. **数据结构**: 数据...

    数据结构与算法-java

    数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。在Java编程中,理解这些概念可以帮助开发者编写出性能优异的程序。以下是基于标题“数据结构与算法-java”及描述中提到的“数据结构与算法...

    数据结构和算法-Flash动画演示

    数据结构和算法是计算机科学的基础,对于理解和设计高效的软件至关重要。本资源——“数据结构和算法-Flash动画演示”提供了一种生动形象的方式来学习这些核心概念。通过Flash动画,你可以直观地看到各种算法的动态...

    数据结构实验-排序算法

    排序算法则是数据结构中的重要部分,它们用于对一组数据进行有序排列。在这个实验中,我们将关注六种不同的排序算法:选择排序、冒泡排序、插入排序、基数排序以及快速排序和归并排序。下面是对这些排序算法的详细...

    数据结构与算法--Java语言描述

    数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于Java语言。在这个“数据结构与算法--Java语言描述”的资料中,我们有望深入理解这些核心概念,并通过Java语言来...

    算法-数据结构和算法-1-算法的引入和算法时间复杂度.rar

    这个压缩包文件"算法-数据结构和算法-1-算法的引入和算法时间复杂度.rar"主要探讨了这两个概念的入门知识,特别是关注算法的时间复杂度分析。 首先,我们需要理解什么是算法。算法是一系列明确的步骤或指令,用于...

    hello-algo-数据结构与算法-zh-csharp.pdf

    本书《Hello 算法》是为了帮助读者学习数据结构与算法而编写的,作者靳宇栋(Krahets)认为刷题虽然是学习算法的一种方法,但对于基础不足的同学来说,可能会感到困扰和挫折。因此,本书旨在引导读者探索数据结构与...

    数据结构与算法-C语言版本

    数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。C语言因其高效、底层特性,常被用于实现数据结构和算法。本资料包“数据结构与算法-C语言版本”聚焦于通过源码实例和答案解析,帮助学习者...

    西安电子科技大学-数据结构与算法-期末知识点总结.pdf

    "西安电子科技大学-数据结构与算法-期末知识点...本资源涵盖了数据结构与算法的基本概念、线性表、栈与队列、树与二叉树、图、查找算法和排序算法等方面的知识点,对于学习数据结构与算法的学生具有重要的参考价值。

    数据结构PPT----排序算法集合(sort )

    在IT领域,排序算法是数据结构与算法中的基础部分,对于高效处理大量数据至关重要。本文主要探讨了排序算法中的几种经典方法,包括直接插入排序、折半插入排序以及希尔排序。 首先,排序定义是为了将一个数据序列...

    数据结构与算法-单链表的排序

    数据结构与算法-单链表的排序

    数据结构与算法---C++版(Adam Drozdek)书中的源代码

    在压缩包文件中,我们可能找到书中提到的各种数据结构和算法的源代码实现,如链表、栈、队列、树、图、排序算法和查找算法等。 1. **链表**:链表是数据结构的基础,包括单链表、双链表和循环链表。在C++中,链表...

    数据结构经典算法-多种排序和查找

    在这个"数据结构经典算法-多种排序和查找"的项目中,我们重点关注了查找和排序这两种核心操作,它们在编程中有着广泛的应用。以下是这些算法的详细介绍: 1. **查找算法**: - **折半查找(二分查找)**:基于有序...

    JAVA数据结构与算法-第二版

    本书旨在帮助读者理解并掌握如何在Java编程环境中有效地设计和实现数据结构及算法,从而提升程序的性能和效率。 首先,数据结构是计算机科学中的核心概念,它涉及到如何组织和存储数据,以便高效地访问和操作。书中...

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    在计算机科学领域中,排序算法是一种基本的算法,它可以将数据按照一定的顺序排列,以便更好地存储、检索和处理数据。排序算法的速度和效率对程序的性能有着至关重要的影响。 1.冒泡排序算法 冒泡排序算法是一种...

    数据结构课程设计---排序算法比较

    数据结构课程设计,C语言,七大排序算法比较

Global site tag (gtag.js) - Google Analytics