排序算法(六)

1. 交换排序—冒泡排序(Bubble Sort)

基本思想:

排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的俩个数依次进行比较

和调整,让较大的数下沉,较小的数往上冒。即:每当俩相邻的数比较后发现他们的排序与排序的要求相反时,就将他们交换。

冒泡排序示例:

算法的实现:

public class BubbleSort2 {

    public static void main(String[] args) {
        int[] a = {12,43,65,72,87,21,98,21,911,679,22,4,1,8,2456,32};
        bubbleSort(a,a.length);

        for(int i=0; i<a.length; i++){
            System.out.print(a[i]+" ");
        }
    }
    public static void bubbleSort(int[] a,int n){
        int temp;
        for(int i=0; i<n-1; i++){
            for(int j=0; j<n-1-i; j++){
                if(a[j] > a[j+1]){
                    temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
            }
        }
    }
}

冒泡排序算法的改进:

对冒泡排序的改进是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时,并没有数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程,本文提供一下俩种改进算法:

1、设置一标志性变量pos,用于记录每一趟排序过程中最后一交换数据的位置。由于pos位置之后的数据已经按要求排列好了,所以下一趟排序的时候只需要扫描到pos位置即可。

改进后算法如下:

public class BubbleSort3 {

    public static void main(String[] args) {
        int[] a = { 12, 43, 65, 72, 87, 21, 98, 21, 911, 679, 22, 4, 1, 8,
                2456, 32 };
        bubbleSort(a, a.length);

        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }

    public static void bubbleSort(int[] a, int n) {
        int i = n - 1; // 初始时,最后位置保持不变
        while (i > 0) {
            int pos = 0; // 每趟开始时,无记录交换
            for (int j = 0; j < i; j++) {
                if (a[j] > a[j + 1]) {
                    pos = j; // 记录交换的位置
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }

            }
            i = pos;// 为下一趟排序作准备
        }
    }
}

2、传统冒泡排序每一趟冒泡排序只能找到一个最大值或者最小值,我们考虑利用在每趟排序中进行正向和反向俩遍的冒泡方法一次可以得到俩个值(最大值和最小值),从而使排序趟数几乎减少一半。

改进后的算法为:

public class BubbleSort4 {

    public static void main(String[] args) {
        int[] a = { 12, 43, 65, 72, 87, 21, 98, 21, 911, 679, 22, 4, 1, 8,
                2456, 32 };
        bubbleSort(a, a.length);

        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }

    public static void bubbleSort(int[] a, int n) {
        int low = 0;
        int high = n - 1;
        int temp, j;
        while (low < high) {
            for (j = low; j < high; ++j) { // 正向冒泡,找到最大值
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }

            }
            --high;// 修改high值, 前移一位
            for (j = high; j > low; --j) {// 反向冒泡,找到最小者
                if (a[j] < a[j - 1]) {
                    temp = a[j];
                    a[j] = a[j - 1];
                    a[j - 1] = temp;
                }

            }
            ++low;// 修改low值,后移一位
        }
    }
}
时间: 2024-12-25 11:56:13

排序算法(六)的相关文章

排序算法六(基数排序)

一.原理介绍 所谓的基数排序算法,即使对于待排序数据,将其看做数据数位相同的数据. 随后一次依据每个数字个位大小排序,重新排序之后,再根据每一个数字的十位大小排序,依次进行,最后数据就可以达到一个整体有序的状态. 二.实例 对于这样的一系列数据: int arr[15] = { 123, 234, 543, 324, 568, 975, 547, 672, 783, 239,124,567,865,579,532 }; 我们依次检索个位,统计每一个数据的个位数,依次放置在 0-9 九个格子里,代

排序算法七:选择排序之堆排序

排序算法七:选择排序之堆排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评>中给出的首个算法就是高效的排序算法.本文将对排序算法做一个全面的梳理,从最简单的"冒泡"到高效的堆排序等. 上博文讲述了选择排序中的简单排序算法,本文介绍的堆排序是树性选择排序,采用堆这个数据结构来辅助排序. 排序相关的的基本概念 排序:将一组杂乱无章的数据按一定的规律顺次排列起来. 数据

各种排序算法的可视化展现

前言 排序算法(Sorting algorithm)是一种能将一串数据依照特定排序方式的最基本最常用的算法,常见的有冒泡排序.快速排序.插入排序.二叉树排序等等,下面这个表格总结了各种排序算法的复杂度与稳定性: 不同的场景对排序算法的选择有着不同的要求,对每种排序算法的深入理解能帮助我们更好地选择合适的算法.关于排序算法的理论书籍或博客已经非常的多,下面列举一些可视化的排序展示,换种方式看算法,以一种更直观的方式理解排序算法的工作原理. 一.SORTING SORTING 支持同时查看对比多个排

第六章 常见排序算法

上章回顾 二叉树的定义 树深度的定义 什么样的二叉树是满二叉树 中序遍历的规则 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第六章 第六章 常见排序算法 常见排序算法 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorith

java排序算法(六):直接插入排序

java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1..n-1)= o(n^2).其他情况下也要考虑移动元素的次数.故时间复杂度是o(n^2) 直接插入空间效率很好,只需要一个缓存数据单元,也就是说空间复杂度是o(1) 直接插入排序是稳定的 直接插入排序在数据以有一定顺序的情况下,效率较好.但如果数据无规则,则需要移动大量的数据.其效率就和冒泡排序和

排序算法(六)——希尔排序

基本思想 希尔排序是基于插入排序的,又叫缩小增量排序. 在插入排序中,标记符左边的元素是有序的,右边的是没有排过序的,这个算法取出标记符所指向的数据,存入一个临时变量,接着,在左边有序的数组中找到临时变量应该插入的位置,然后将插入位置之后的元素依次后移一位,最后插入临时变量中的数据. 试想,假如有一个很小的数据项在靠近右端的位置上,把这个数据项插入到有序数组中时,将会有大量的中间数据项需要右移一位,这个步骤对每一个数据项都执行了将近N次复制.虽然不是所有数据项都必须移动N个位置,但是,数据项平均

数据结构与算法小结——排序(六)

3.2 快速排序 快速排序综合性能优越,其主要思想在于找一个pivotvalue,通过不断的比较.交换,将序列变成pivotvalue前的值都比它小,在其后的值都比它大:然后,再对pivotvalue前面的序列和后面的序列分别使用同样的方法得到具有该性质的序列.....不断递归调用至最底层即排好序.其基本流程如图 1所示. 图 1 快速排序基本流程 分析快速排序的时间复杂度,可以画出一个二叉树,二叉树的结点即是每一层递归选用的pivotvalue.显然,如果pivotvalue选择得当,使得递归

【整理】常见排序算法及其时间复杂度总结

原文出处: 1. 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 2. 面试常用算法总结--排序算法(java版) 3. 常见排序算法小结 本篇主要整理了冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序,堆排序七种常见算法,是从上面三篇博文中摘抄整理的,非原创. 一.冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就"沉"到最后面了.重复N次即可以使数组有序. 冒泡排序改进1: 在某次遍历中,如果没有

8大排序算法图文讲解

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 本文将依次介绍上述八大排序算法. 算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤: 1)将第一待排序序列第一

排序算法的基本思想和OC代码实现

算法的基本思想和OC代码实现 一 .冒泡排序   (平均时间复杂度 o(N*N))  基本思想:两个数比较大小,较大的数下沉,较小的数冒起来. 过程:比较相邻的两个数据,如果第二个数小,就交换位置 从后向前两两比较,一直到比较最前两个数据.最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了. 继续重复上述过程,依次将第2,3,….,n-1个最小数排好位置. int arr[5]={23,21,45,23,64}; int temp; for (int i=0; i<4; i++) {