简单选择排序

找到数组中的最大值或最小值时再将值进行交换

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

using System.Threading.Tasks;

namespace 简单选择排序
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = new int[] { 42, 20, 99, 12, 44, 4, 66, 88, 24, 93, 1, 22 };//需要排序的数组
            Stopwatch watch = new Stopwatch();//创建StopWatch类的对象
            watch.Start();//调用类中的start函数开始计时      
            Bubbing(array);//用冒泡排序算法对数组进行排序
            watch.Stop();//调用StopWatch类中的stop函数,终止计时
            Console.WriteLine(watch.Elapsed);//输出直接插入排序的用时
            foreach (var item in array)//输出已近排序好的数组
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
        /// <summary>
        /// 简单选择排序,找到数组中的最大值或最小值时在交换
        /// </summary>
        /// <param name="array"></param>

        private static void Bubbing(int[] array)
        {
            for (int i = 0; i < array.Length-1; i++)
            {
                int index = i;
                int temp = array[i];
                for (int j = i+1; j < array.Length; j++)
                {
                    if(temp>array[j])
                    {
                        temp = array[j];
                        index = j;//记录要交换值的下标,因为暂时还不确定这个值是否为最小值,所以记录下标
                    }
                }
                if(temp!=i)//找到数组的最小值,把最小值放在array[i]位置
                {
                    array[index] = array[i];
                    array[i] = temp;
                }
            }
        }
    }
}

 

堆排序:将完全二叉树构造成大顶堆或小顶堆。

实现大顶堆:在每个顶推的父节点和子节点中找到最大值,放入父节点中(实质是大于父节点的子节点中拿出最大的子节点与父节点交换)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 简单选择排序
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = new int[] { 49,38,65,97,76,13,27,49};
            HeapSort(array);
            foreach (var item in array)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

        private static void HeapSort(int[] array)
        {
            for (int i = array.Length/2; i >0; i--)//对每个分支节点进行堆排序
            {
                int temp = i;
                int index = i;
                while(true)
                {
                    int leftChild = 2 * temp;
                    int rightChild = 2 * temp + 1;
                    if(rightChild<=array.Length&& array[rightChild - 1] > array[temp - 1])
                    {                  
                            temp = rightChild;                
                    }
                    if(leftChild<=array.Length&& array[leftChild - 1] > array[temp - 1])
                    {                      
                            temp = leftChild;                                         
                    }
                    if(temp!=index)//子节点大于父节点,所以交换子节点与父节点
                    {
                        int value = array[index-1];
                        array[index-1] = array[temp-1];
                        array[temp-1] = value;
                        index = temp;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
    }
}

 

posted on 2019-08-26 19:45  慕容锤  阅读(193)  评论(0编辑  收藏  举报