八大内部排序算法(上)-冒泡、直接插入、简单选择、快速

八大内部排序算法(上)冒泡、直接插入、简单选择、快速

排序分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

我们这里说说八大排序就是内部排序。

1.直接插入排序

将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。

要点:设立哨兵,作为临时存储和判断数组边界之用。

直接插入实现如下:

        /*
	 * 1.插入排序
	 * 思想:每遍历一次,都把数组中下表为当前遍历次数的数字插入到已经排好的顺序当中去
	 * 插入排序中,总是先寻找插入位置,然后在实行挪动和插入过程;寻找插入位置采用顺序查找的方式(从前向后或者从后向前),
	 * 既然需要插入的数组已经是有序的,那么可以采用二分查找方法来寻找插入位置,提高算法效率,但算法的时间复杂度仍为O(n2)。
	 */
	public void insertSort(Integer []array){
		int size=array.length;
		int temp;
		System.out.println("插入排序结果:");
		for(int i=1;i<size;i++){
			if(array[i]<array[i-1]){
				for(int j=i;j>0;j--){
					if(array[j]<array[j-1]){
						temp = array[j-1];
						array[j-1] = array[j];
						array[j] = temp;
					}
				}
				//=========输出排序详情
				System.out.print("第" + (i) +"次:");
				for (int j = 0; j < array.length; j++) {
					System.out.print(array[j] + " ");
				}
				System.out.println();
			}
		}
	}

2.简单选择排序

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。具体实现如下

<span style="white-space:pre">	</span>/*
	 * 2.简单选择排序
	 * 思想:遍历数组剩余数字,每次选择最小的一个数和当前的遍历次数位置数字替换
	 */
	public void choiceSort(Integer []array){
		int size=array.length;
		System.out.println("\n选择排序:");
		for (int i = 0; i < size; i++) {
			int temp = array[i],min=i;
			for (int j = size-1; j >=i; j--) {
				if(array[j] <temp){
					temp = array[j];
					min=j;
				}
			}
			if(min!=i){
				array[min]=array[i];
				array[i]=temp;
			}
			//=========输出排序详情
			System.out.print("第" + (i+1) +"次:");
			for (int j = 0; j < array.length; j++) {
				System.out.print(array[j] + " ");
			}
			System.out.println();
		}
	}

3.冒泡排序

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

//3.冒泡排序
    public void Bubble_Sort(Integer []array){
        int size = array.length;
        int tmp;
        System.out.println("冒泡排序结果:");
        for(int i=0;i<size;i++){
            for(int j=size-1;j>i;j--){
                if(array[j]<array[j-1]){
                    tmp=array[j-1];
                    array[j-1]=array[j];
                    array[j]=tmp;
                }
            }
            //=========输出排序详情
            System.out.print("第" + (i+1) +"次:");
            for (int j = 0; j < array.length; j++) {
                System.out.print(array[j] + " ");
            }
            System.out.println();
        }
    }

4.快速排序

基本思想:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

具体实现如下:

/*
     * 4.快速排序
     */
    public void QuickSort(Integer []array, int low, int high){
        int i=low,j=high;
        if(i<j){
            int po = array[low];
            while(i<j){
                while(i<j && po<array[j]){
                    j--;
                }
                if(i<j){
                    int temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                    i++;
                }
                while(i<j && po>array[i]){
                    i++;
                }
                if(i<j){
                    int temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                    j--;
                }
            }
            QuickSort(array,low,j-1);
            QuickSort(array,j+1,high);
        }
    }

测试:

package com.devin.sequence;
/**
 *
 * @JavaTest
 * @author  刘帝伟
 * @date    创建时间:2015年4月14日 下午3:19:35
 * @version 2015年4月14日
 *
 */
public class Test {

	public static void main(String[] args) {
		Integer [] array = {1,33,3,14,5,71,6,88};

		Test t = new Test();
		//t.Bubble_Sort(array);
		System.out.println();
//		t.insertSort(array);
		//t.choiceSort(array);
		//快速排序
		t.QuickSort(array, 0, array.length-1);
		System.out.println();
		for (int j2 = 0; j2 < array.length; j2++) {
			System.err.print (array[j2]+" ");
		}
	}
}

时间: 2024-08-03 23:47:51

八大内部排序算法(上)-冒泡、直接插入、简单选择、快速的相关文章

JavaScript实现八大内部排序算法

注:基数排序中:r是关键字的基数,d是长度,n是关键字的个数 1.插入排序 基本思想:在序号i之前的元素(0到i-1)已经排好序,本趟需要找到i对应的元素x (此时即arr[i]) 的正确位置k,在寻找位置k的过程中与序号i-1到0的元素依次进行比较.如果x小于比较元素,则比较元素向后移动一位:否则,结束移位,将x插入当前位置k 1 function insertSort(arr) { 2 for (let i = 1; i < arr.length; i++) { 3 // 将待插入元素提取出

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

内部排序算法小结

内部排序算法主要分为插入类排序.交换类排序和选择类排序,它们在性能上的差异主要体现在时间复杂度.空间复杂度和稳定性.各种排序算法都会进行元素间的比较和移动,时间复杂度主要由整个排序过程中的比较次数和移动次数决定.空间复杂度体现在除了待排序记录本身所占的空间,排序过程中占用了多少辅助空间. 1.插入类排序 直接插入排序 如果待排序记录之间是顺序排列,此时整个排序过程中元素比较的次数为n-1次,移动次数为0次.如果待排序记录之间是逆序排列,第i趟排序比较次数为i,移动的次数为i+1,其中i的范围是2

数据结构6种内部排序算法的比较

1.需求分析 (1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据 (2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)的数据 (3)程序能达到的功能:对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序这6种常用的内部排序算法进行比较,比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动) (4)测试数据:正确输入为由伪随机数产生程序产生100个随机数,然后输出比较结果,错

内部排序算法(一):交换排序(冒泡排序,快速排序)

这是我的博文系列<内部排序算法>的第一篇.所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.所谓内部排序,是指在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内.外存交换(外排序的定义则相反). 内部排序法按照策略可以划分为五类:插入排序.选择排序.交换排序.归并排序和分配排序.待排文件的存储方式采用顺序表(或直接用向量)作为存储结构(其他的存储结构还有以链表作为存储结构等). 在这个系列的博文中,我按照排序算法的给出,排序算法的分析(包括算法的时空复杂度

Java实现各种内部排序算法

数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成. 性能:时间复杂度:最好o(n):有序,最坏o(n^2):逆序,平均o(n^2):空间复杂度o(1):稳定 1 public int[] straightInsertSort(int array[]){ 2 int

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <

排序算法-(冒泡、选择、插入算法)

运行效率较慢的三大排序算法:冒泡.选择与插入算法,时间复杂度都为O(n2),运行效率较慢. #python 代码实现如下所示: li=[2,1,4,5,7,8,9,5,3]#冒泡算法(升序算法)O(n2)import randomfrom cal_time import *@cal_timedef bubble_sort(li): for i in range(len(li)-1): #第i趟 exchange=False for j in range(len(li)-i-1): #无序区域为n

冒泡,简单选择,直接插入排序比较(Java版)

冒泡,简单选择,直接插入这三种排序都是简单排序. 工具类 package Utils; import java.util.Arrays; public class SortUtils { public static void swap(int[] a,int i,int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } public static void printString(int[] a){ System.out.println(Array