内部排序一

  闲来无事,复习下数据结构的常用内部排序,利用下午的时间,随便写了选择、快速排序、内部排序的实现,虽然常用数据结构算法原理还是挺简单,可以完成写出来还是费了一些工夫。此处贴出代码,仅作自己的随手联系之用。

public class Program {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

           int[] array = CreateRandomArray(20);
           Display(array);
           SelectSortClass.Sort(array);
           Display(array);
           QuickSortClass.Sort(array);
           Display(array);
           HeapSortClass.Sort(array);
           Display(array);
    }

    private static int[] CreateRandomArray(int n)
    {
        int[] array = new int[n];
        Random rnd = new Random();
        for(int i = 0;i<n;i++)
        {
            array[i] = rnd.nextInt(n*10);
        }
        return array;
    }

    private static void Display(int[] array)
    {
        for(int i =0;i<array.length;i++)
        {
            System.out.print(array[i] + "  ");
        }
        System.out.println();

    }

}

选择排序的实现如下:

public class SelectSortClass
{
       public static void Sort(int[] array)
    {
        for(int i = 0;i < array.length;i++)
        {
            int minIndex = i;
            for(int j = i +1;j<array.length;j++)
            {
                 if(array[minIndex] > array[j])
                       minIndex = j ;
            }
            if(minIndex != i)
            Swap(array,minIndex,i);
        }
    }

    private static void Swap(int[] array,int m,int n)
    {
         int temp = array[m];
         array[m] = array[n];
         array[n] = temp;
    }

}

快速排序的实现如下:

public class QuickSortClass
{

    /**
     * 快速排序
     * @param array
     * @param left
     * @param right
     */
    public static void Sort(int[] array)
    {
        QuickSort(array,0,array.length -1);
    }

    private static void QuickSort(int[] array,int left,int right)
    {
        if(left<right)
        {
            int partion = Division(array,left,right);
            QuickSort(array,left,partion-1);
            QuickSort(array,partion +1 ,right);
        }

    }

    private static int Division(int[] array,int left,int right)
    {
        int temp = array[left];
        while(left < right)
        {
            while(left < right && temp <= array[right])
                right--;
            array[left] = array[right];
            while(left < right && temp >= array[left])
                left++;
            array[right] = array[left];
        }
        array[left] = temp;
        return left;
    }
}

堆排序的实现如下:

public class HeapSortClass {

    /**
     * 堆排序
     * @param array
     */
    public static void Sort(int[] array)
    {
        BuildMaxHeap(array); //产生大顶堆
        for(int i = array.length - 1;i>=0;i--)
        {
            Swap(array,0,i);//交换大顶堆的元素,到数组最后一个
            MaxHeapUpdate(array,0,i);//前i个元素产生大顶堆
        }
    }

    private static void BuildMaxHeap(int[] array)
    {
           for(int i = (array.length / 2) -1; i >= 0; i--)
           {
               MaxHeapUpdate(array,i,array.length);
           }
    }

    private static void MaxHeapUpdate(int[] array ,int i,int heapSize)
    {
        int left = i* 2;
        int right = i* 2 +1;
        int max = i;
        if(right < heapSize)
        {
             if(array[left] >= array[right])
             {
                 if(array[left] > array[i])
                     max = left;
             }
             else
             {
                 if(array[right] > array[i])
                     max = right;
             }
        }
        if(max != i)
        {
            Swap(array,max,i);
            MaxHeapUpdate(array,max,heapSize);
        }
    }

    private static void Swap(int[] array,int m,int n)
    {
         int temp = array[m];
         array[m] = array[n];
         array[n] = temp;
    }

}
时间: 2024-10-12 15:39:57

内部排序一的相关文章

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

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

10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 基数排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下载  链接? 数据

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

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

直接插入排序(内部排序)

1 package com.trfizeng.insertionsort; 2 3 /** 4 * 5 * @author trfizeng 内部排序 插入排序 --- 直接插入排序(Straight Insertion Sort) 6 * 7 */ 8 public class StraightInsertionSort { 9 public static int[] straightInsertionSort(int[] array) { 10 // 对传来的待排序数组进行合法验证 11 i

简单的选择排序(内部排序)

1 /** 2 * 3 */ 4 package com.trfizeng.selectionsort; 5 6 /** 7 * @author trfizeng 内部排序 选择排序—简单选择排序(Simple Selection Sort) 8 */ 9 public class SimpleSelectionSort { 10 11 /** 12 * 每次选择一个最小记录放在前面去 13 */ 14 public static int[] simpleSelectionSort(int[]

内部排序-第10章-《数据结构题集》习题解析-严蔚敏吴伟民版

//**留坑待填**// 一.基础知识题 10.1?以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态: (1)直接插入排序:                            (2)希尔排序(增量d[1]=5): (3)快速排序:                                  (4)堆排序: (5)归并排序:                              

10-12-顺序表地址排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 顺序表地址排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链

10-9-堆排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 堆排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链接? 数

基于比较的内部排序总结

★ 基于“比较”操作的内部排序性能大PK 我们首先总结一下<排序结构专题1-4>中的十种方法的性能((N个关键字的待排序列)): 排序方法        平均时间   最坏时间    辅助存储空间   稳定性   直接插入排序 O(N^2)   O(N^2)    O(1)                √      折半插入排序 O(N^2) O(N^2)  O(1)      √ 希尔排序  O(N*logN) O(N*logN) O(1)        × 起泡排序        O(N