几种基本排序

1、冒泡排序

public static void sort(long[] array){
		long tmp = 0;
		for (int i = 0; i < array.length - 1; i++) {			//需要的遍历次数
			for (int j = array.length - 1; j > i; j--) {
				if(array[j] < array[j - 1]){
					tmp = array[j];
					array[j] = array[j - 1];
					array[j - 1] = tmp;
				}
			}
		}
	}

2、选择排序

public static void sort(long[] array){
		int k = 0;
		long tmp = 0;
		for (int i = 0; i < array.length - 1; i++) {
			k = i;
			for (int j = i; j < array.length; j++) {
				if(array[j] < array[i]){
					k = j;
				}
			}
			tmp = array[k];
			array[k] = array[i];
			array[i] = tmp;
		}
	}

3、插入排序

public static void sort(long[] array) {
		long tmp = 0;
		for (int i = 1; i < array.length; i++) {
			tmp = array[i];
			int j = i;
			while(j > 0 && array[j - 1] >= tmp) {
				array[j] = array[j - 1];
				j--;
			}
			array[j] = tmp;
		}
	}

4、希尔排序

public static void sort(long[] array) {
		int h = 1;
		//计算最大间隔
		while(h < array.length / 3) {
			h = h * 3 + 1;
		}
		while(h > 0){
			long tmp = 0;
			for (int i = h; i < array.length; i++) {
				tmp = array[i];
				int j = i;
				while(j > h - 1 && array[j - h] >= tmp) {
					array[j] = array[j - h];
					j -= h;
				}
				array[j] = tmp;
			}
			//减小间隔
			h = (h - 1) / 3;
		}
	}

5、快速排序

/*
	 * 划分数组
	 */
	public static int partition(long array[],int left,int right,long point){
		int leftPtr = left - 1;
		int rightPtr = right;
		while(true){
			//循环将比关键字小的留在数组的左边
			while(leftPtr < rightPtr && array[++leftPtr] < point);
			//循环将比关键字大的留在数组的右边
			while(rightPtr > leftPtr && array[--rightPtr] > point);
			if(leftPtr >= rightPtr){
				break;
			} else {
				long tmp = array[leftPtr];
				array[leftPtr] = array[rightPtr];
				array[rightPtr] = tmp;
			}
		}
		long tmp = array[right];
		array[right] = array[leftPtr];
		array[leftPtr] = tmp;
		return leftPtr;
	}

	public static void sort(long array[],int left,int right){
		if(left - right >= 0){
			return;
		} else {
			long point = array[right];
			//获取划分点
			int partition = partition(array, left, right, point);
			//对左边的再次进行划分
			sort(array, left, partition - 1);
			//对右边的再次进行划分
			sort(array, partition + 1, right);
		}
	}
时间: 2024-07-31 18:11:50

几种基本排序的相关文章

7种基本排序算法的Java实现

7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 1 /** 2 * 直接插入排序 3 * 不稳定 4 * 时间复杂度:O(n^2) 5 * 最差时间复杂度:O(n^2) 6 * 空间复杂度:O(1) 7 * 使用场景:大部分元素有序 8 * @param elements 9 * @param comparator 10 * @param <T> 11 */ 1

C#12种顺序排序

这篇主要写关于顺序排序的十二种算法,也是我有关算法的第一帖.主要是写,对每种算法的理解与测试. 速度测试,主要根据一千.一万.五万.百万这 四种.速度纪录还是用Stopwatch 这个类.使用随机数Random生成随机的集合. 其中数量五万左右的小数量排序,使用快速排序,速度最快.大数量百万左右使用鸽巢排序,速度最快.废话不多说,接下来上代码. 第一种:冒泡排序 冒泡排序我相信是每个程序员,都会学到的一种比较排序算法.非常简单,通过多次重复比较每对相邻元素,并按规定的顺序交换他们,最终把数列进行

几种内部排序-分类-复杂性-稳定性

1. 简述 本文主要说明一些常用的内部排序算法的分类.复杂性和稳定性.主要基于现在的理解和学习,详细准确的复杂度可以参见维基百科等比较权威的网站,对于一些算法的不同实现,复杂度也不同,这里给出的复杂度都是相对较好的算法的复杂度. 2. 分类    3. 复杂性和稳定性 冒泡排序:在已经有序的情况,取得O(N)的复杂度.    快速排序:每次递归都是N的复杂度,递归次数根据序列有关系,当已经有序的情况下,递归N次,时间复杂度为O(N*LogN)    插入排序:在已经有序的情况,取得O(N)的复杂

算法复杂度,及三种主要排序算法的研究

一.时间复杂度 1.时间频度  T(n),n为问题的规模 即--算法中语句的执行次数.又叫语句频度. 2.时间复杂度 记作 O( f(n) ),这里的f(n)是一个T(n)的同数量级函数. 如O(1)表示算法的语句执行次数为一个常数,不随规模n的增长而增长: 又如T(n)=n^2+3n+4与T(n)=4n^2+2n+1它们的频度不同, 但时间复杂度相同,都为O(n^2). 3.算法的性能 主要用算法的 时间复杂度 的数量级来评价一个算法的时间性能. 二.空间复杂度 S(n),包括3方面: 1.算

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

4种基本排序&2种查找

<?php $arr=array(5,2,1,7,8,6,3,10,9); showArray($arr); /** * 遍历打印数组 * @param string $type  排序方式 * @param array $arr    排序数组 */ function showArray($arr,$type='原数组'){ echo "$type:<br/>"; foreach ($arr as $v){ echo ' '.$v.' '; } echo '<

笔试算法题(53):四种基本排序方法的性能特征(Selection,Insertion,Bubble,Shell)

四种基本算法概述: 基本排序:选择,插入,冒泡,希尔.上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件.前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成正比: 前三种算法在平均,最坏情况下都是N2,而且都不需要额外的内存:所以尽管他们的运行时间只相差常数倍,但运行方式不同: 对于已经就序的序列而言,插入排序和冒泡排序的运行时间都是O(N),但是选择排序的时间仍旧是O(N^2): 因为Insertion和Bubble都是相邻项间的比较交换,所以不会出

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

八种基本排序

排序内部排序(数据保存在内存中)1.交换排序(冒泡排序,快速排序)2.选择排序(直接选择排序,堆排序)3.插入排序(直接插入排序,希尔排序)4.归并排序 八种基本排序方法1.选择排序2.插入排序3.冒泡排序4.希尔排序5.快速排序6.归并排序7.堆排序8.基数排序(这里没有列出) 1 //1冒泡排序 2 void BuddleSort(int a[], int n)//由小到大,每比较一次小的向前 3 { 4 int i, j, t; 5 for (i = 0; i < n - 1; i++)/

数据结构——排序——8种常用排序算法稳定性分析

首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前. 其次,说一下稳定性的好处.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用.基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的.另外,如果排序算法稳定,对基于比较的排序算法而言