几种简单的排序

1、简单选择排序

选择排序又叫简单选择排序。基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好的数列的最后。直到全部待排序数据元素排完。

        void select(int[] list)
        {
            int min = 0;
            for (int i = 0; i < list.Length; i++)
            {
                min = i;
                for (int j = i + 1; j < list.Length; j++)
                {
                    if (list[j] < list[min])
                    {
                        min = j;
                    }
                }
                if (i != min)
                    swap(list, i, min);
            }
        }

        void swap(int a,int b)
        {
            int itemp = a;
            a = b;
            b = itemp;
        }

2、直接插入排序

基本思想:顺序地将待排序的记录按关键码的大小插入到已排序的记录子序列的适当位置。子序列的记录个数从1开始逐渐增大,当子序列的记录个数与顺序表中的记录个数相同时排序完毕。

        void InsertSort(List<int> list)
        {
            for (int i = 1; i < list.Count; i++)
            {
                if (list[i] < list[i - 1])
                {
                    int temp = list[i];
                    int j = 0;
                    for (j = i - 1; j >= 0 && temp < list[j]; j--)
                    {
                        list[j + 1] = list[j];
                    }
                    list[j + 1] = temp;
                }
            }

        }

3、冒泡排序

首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序则交换位置,然后比较第二个和第三个记录的关键字,依此类推,直到第n-1个记录和第n个记录比较过为止。此称为第一趟冒泡排序,结果是关键字最大的记录被交换到第n个记录的位置上。然后进行第二趟,对前n-1个记录进行同样的操作,其结果是关键字次大的记录被交换到第n-1个记录的位置。最多进行n-1趟,所有记录有序排列。若在某趟冒泡排序过程没有进行相邻位置的元素交换处理,则可结束排序过程。

        void mp(int[] list)
        {
            for (int i = 0; i < list.Length; i++)
            {
                for (int j = 0; j < list.Length - i - 1; j++)
                {
                    if (list[j] > list[j + 1])
                    {
                        int temp = list[j];
                        list[j] = list[j + 1];
                        list[j + 1] = temp;
                    }
                }
            }
        }

4、快速排序

任意取一个数作为枢纽元素,遍历整个数组,low位索引从前往后,high位索引从后往前,直到low位找到比枢纽大的位置,high找到比枢纽小的位置,交换这两个数据,然后low为索引继续往后,high位索引继续往前遍历。第一趟遍历完后,如果当前high位比低位大,再把低位到当前high位的数据进行上面的遍历交换,如果当前low位比最高位小,再把当前low位到最高位进行前面的遍历交换。最后整个数列就是有序排列了。

        void QuickSort(int[] pDataNum, int low, int high)
        {
            int i, j, iTemp, middle;
            i = low;
            j = high;
            middle = (low + high) / 2;//也可以是其他任意数据,low、high均可。我这里取的中位。

            while (i < j)
            {
                while ((pDataNum[i].CompareTo(pDataNum[middle]) < 0) && i < high)
                {
                    i++;
                }
                while (pDataNum[j].CompareTo(pDataNum[middle]) > 0 && j > low)
                {
                    j--;
                }
                if (i <= j)
                {
                    if (pDataNum[i] > pDataNum[j])
                    {
                        iTemp = pDataNum[i];
                        pDataNum[i] = pDataNum[j];
                        pDataNum[j] = iTemp;
                    }
                    i++;
                    j--;
                }
            }
            if (j > low)
                QuickSort(pDataNum, low, j);
            if (i < high)
                QuickSort(pDataNum, i, high);
        }

5、堆排序

直接排序中,顺序表是一个线性结构。要从有n个记录的顺序表中选择出一个最小的记录需要比较n-1次。如把待排序的n个记录构成一个完全二叉树结构,则每次选择出一个最大(或最小)的记录比较次数是完全二叉树的高度即log2n 次。则排序算法的时间复杂度就是 o(log2n)。

       /// <summary>
        /// 维护最大堆
        /// </summary>
        /// <param name="a"></param>
        /// <param name="i"></param>
        /// <param name="length"></param>
        void maxHeapify(int[] a,int i,int length)
        {
            int l = left(i);
            int r = right(i);
            int max;
            if(l<length&&a[l]>a[i])
            {
                max = l;
            }
            else
            {
                max = i;
            }
            if(r<length&&a[r]>a[max])
            {
                max = r;
            }
            if(max!=i)
            {
                swap(a, i, max);
                maxHeapify(a, max, length);
            }
        }

        int left(int i)
        {
            return 2 * i ;
        }

        int right(int i)
        {
            return 2 * i + 1;
        }

        /// <summary>
        /// 建堆
        /// </summary>
        /// <param name="a"></param>
        void buildMaxHeap(int[] a)
        {
            for (int i = a.Length/2+1; i >=0; i--)
            {
                maxHeapify(a, i,a.Length);
            }
        }

        void heapSort(int[] a)
        {
            //首先建立最大堆,完成后第一个元素为最大值。
            buildMaxHeap(a);
            int length = a.Length;
            for (int i = a.Length - 1; i >= 1; i--)
            {
                //将第一个最大的元素移到后面,并且在maxHeapify的过程中通过减小length忽略它。
                swap(a, i, 0);
                length--;
                maxHeapify(a, 0, length);
            }
        }
时间: 2024-10-03 09:31:16

几种简单的排序的相关文章

使用JavaScript几种简单的排序

前几天在工作碰到一个json对象排序的问题,一直认为JavaScript不能进行对象的排序,其实并不是,今天就来总结下常见的几种简单排序: 第一类 纯数字: var arrOld = [4,10,9,1,0,31]; var arrNew = arrOld.sort(sortNum); function sortNum (a,b){ return a-b; } //输出结果:[0, 1, 4, 9, 10, 31] sort()   方法用于对数组的元素进行排序,在原数组上进行排序,不生成副本.

四种简单的排序算法

我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF.Asp.Net MVC.AJAX等,熟练应用一些已经比较成熟的技术,比如Asp.Net.WinForm.还应该有着牢固的计算机基础知识,比如数据结构.操作系统.编译原理.网络与数据通信等.有的朋友可能觉得这方面的东西过于艰深和理论化,望而却步,但我觉得假日里花上一个下午的时间,研究一种算法或者一种数据结构,然后写写心得,难道不是一件乐事么?所以,我打算将一些常见的数据结构和算法总结一下,不一定要集中一段时间花费很大精力

三种简单的排序算法

排序算法总是分不清,借了本数据结构来专门看了一下 说一下分类,主要有五类,插入排序,交换排序,选择排序,基数排序和归并排序 今天中午看了一下插入排序中的直接插入排序,交换排序的冒泡排序,选择排序中的冒泡排序 1.插入排序 将数组分成两个部分,一个是有序,一个是无序.将无序的每个元素插入到有序中,一共需要n - 1趟,最后一个元素不用计算 每一趟将第1个元素即array[i]元前面的i个元素比较,如果比array[i]大则后移一个位置.这样找到第i个元素的位置,插入 2.冒泡排序 将相邻两个元素比

两种简单的排序—适合我这样的新手

============================================= 一种:选择排序 package edu.xl.lesson1;/** * 选择排序 * @author Administrator * */public class Selection_Sort { public static void main(String[] args) { //实例化一组数 int a[]={2,42,245,53,13,46,1,5,75,34}; for(int i = 0;i

四种简单的排序算法的php实现

无聊,用php写几个排序算法,算法介绍请移步这里,这里使用php实现了几个简单的,如下 //选择排序 function selection_sort($arr){ $len = count($arr); if($len <= 1) return $arr; for($i=0; $i<$len; $i++){ $min = $arr[$i]; $pos = $i; for($j=$i+1; $j<$len; $j++){ if($min > $arr[$j]){ $min = $ar

java 3种简单的排序

1.冒泡排序 public class MaxMin{ public static void main(String args[]){ int a[]={5,4,9,8,7,6,0,1,3,2}; bubbleSort(a); //静态方法中直接通过类名调用静态方法,或者通过对象去调用非静态的方法 for(int i=0;i<a.length;i++){ System.out.print(a[i]+""); } } public static void bubbleSort(in

Python实现几种简单的排序算法

一.冒泡排序 概念:为一个无序的列表排成有序的 实现过程描述:(升序) 1.比较相邻的元素,如果第一个比第二个大,就交换他们的位置 2.对每一对相邻元素重复1的工作,从开始第一队到最后一对,最后结束的时候最大的数会在后面 3.针对所有元素重复1,2的工作,除了最后一个数,因为最后的数最大,省略这个过程 4.持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较 复杂度: 时间复杂度为O(n^2) 代码实现: #给定一个列表 list = [11,54,3243,323,3,82,1

三种简单的排序写下贴上

void Qsort(int *a,int L,int R) {    if(L>=R) return ;    int p=L,q=R;    int val=a[L];    while(p!=q) {        while(p<q&&a[q]>val) q--;        if(p<q) a[p++]=a[q];        while(p<q&&a[p]<=val) p++;        if(p<q) a[q-

三种简单排序

1.冒泡排序 冒泡排序是一种简单的排序算法,其基本思想如下: 1)从第一个开始起,比较相邻的两个元素的大小,如果前一个比后一个大,则进行交换(也就是小的冒上去). 2)然后再和之前相邻元素进行比较,若小,则冒上去. 2)重复以上操作,直到最后一个元素. 1 public static void BubbleSort(long[] arr){ 2 long tmp = 0; 3 for(int i=0;i<arr.length-1;i++){ 4 for(int j=arr.length-1;j>