简单选择排序
找到数组中的最大值或最小值时再将值进行交换
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; } } } } } }