C#几种排序方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Sort();
            int[] arr = new int[] { 6, 3, 8, 4, 6, 3, 2,5,6,8 };
            XESort(arr,7);
        }
    }
    //插入排序:从第二个数据开始,遍历所有元素,作为基准点;然后遍历这个基准点之前的所有元素和这个数据进行比较,
    //然后判断,数据大小,大的后移,利用j--,一直找到合适的位置,然后arr[j]=temp;赋值即可
    private void Sort()
    {
        int[] arr = new int[] { 56,12,34,45,22,34,56,23,45,67};
        int i, j, temp;
        for (i = 0; i < arr.Length; i++)
        {
            temp = arr[i];
            for (j = i; j > 0; j--)
            {
                if (temp < arr[j - 1])
                {
                    arr[j] = arr[j - 1];
                }
                else
                {
                    break;
                }
            }
            arr[j] = temp;
        }
    }
    //希尔排序
    private void XESort(int[] a, int n)
    {
        //  int[] arr = new int[] { 6, 3, 8, 4, 6, 3, 2,5,6,8 };
        int i, j, h,temp;
        for (h = n / 2; h > 0; h = h / 2)//循环所得 增量值
        {
            for (i = h; i < n; i++)//循环的到点值
            {
                temp = a[i];//把点值付给temp
                for (j = i - h; j >= 0 && temp < a[j]; j = j - h)
                {
                    a[j + h] = a[j];
                }
                a[j + h] = temp;//很多情况下这个j为负值-1
            }
        }
    }
    //冒泡排序
    private void MPSort()
    {
        int[] arr = new int[] { 6, 3, 8, 4, 6, 3, 2, 5, 6, 8 };
        int middleVal;
        bool flag = false; //交换标志
        for (int i = 1; i < arr.Length; i++)
        {
            flag = false;
            for (int j = arr.Length - 1; j >= i; j--)
            {
                if (arr[i] < arr[j - 1])
                {
                    middleVal = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = middleVal;
                    flag = true;
                }
            }
            if (!flag) //如果没有发生交换,终止算法
                return;
        }
    }
    //快速排序
    private static void QuickSort(int lowest, int highest)
    {
        int[] array = new int[] { 49, 38, 65, 97, 76, 13, 27, 49 };
        if (array == null || lowest < 0 || lowest >= highest || highest >= array.Length)
        {
            return;
        }
        int low = lowest;
        int high = highest;
        int key = low++;
        for (; low <= high; )
        {
            if (key < high)
            {
                if (array[key] > array[high])
                {
                    array[high] = array[key] + (array[key] = array[high]) * 0;
                    key = high;
                }
                high--;
            }
            if (key > low)
            {
                if (array[key] < array[low])
                {
                    array[low] = array[key] + (array[key] = array[low]) * 0;
                    key = low;
                }
                low++;
            }
        }
        for (int i = 0; i < array.Length; i++)
        {
            Console.Write(array[i] + ", ");
        }
        Console.WriteLine();
        QuickSort(lowest, key - 1);
        QuickSort(key + 1, highest);
    }
    //选择排序
    //从第一个开始 每一个他后边的所有进行比较,如果前边的大于后边的那么两者交换值,最小的值在前边,最大的值在最后 ------- 命名;向后扫描法
    protected void Button2_Click(object sender, EventArgs e)
    {
        int[] arr = new int[] { 49, 38, 65, 97, 76, 13, 27, 49 };
        int min, tmp;
        for (int i = 0; i < arr.Length - 1; i++)
        {
            min = i;
            for (int j = i + 1; j < arr.Length; j++)
            {
                string a = arr[min].ToString();
                string b = arr[j].ToString();
                if (arr[min] > arr[j])
                {
                    min = j;//每一个for循环一遍的到一个每次中的最小的值的索引
                }
            }
            tmp = arr[i];
            arr[i] = arr[min];
            arr[min] = tmp;
        }
        foreach (var a in arr)
        {
            Response.Write(a + ",");
        }
    }
}

  

posted @ 2012-08-06 13:28  Star★  阅读(1283)  评论(0编辑  收藏  举报