已完成以下算法:冒泡排序,插入排序,希尔排序,快速排序,基数排序

来源:互联网 发布:js configurable 编辑:程序博客网 时间:2024/06/04 18:25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="arr"></param>
public void Sort(int[] arr)
{
    for (int i = arr.Length - 1; i > 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            if (arr[i] < arr[j])
            {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}
 
/// <summary>
/// 插入排序
/// </summary>
/// <param name="arr"></param>
public void Sort(int[] arr)
{
    for (int i = 1; i < arr.Length; i++)
    {
        int t = arr[i];
        int j = i;
        while ((j > 0) && (arr[j - 1] > t))
        {
            arr[j] = arr[j - 1];//交换顺序    
            --j;
        }
        arr[j] = t;
    }
}
 
/// <summary>
/// 快速排序
/// </summary>
/// <param name="list"></param>
/// <param name="low"></param>
/// <param name="high"></param>
public void Sort(int[] list, int low, int high)
{
    int pivot;
    int l, r;
    int mid;
    if (high <= low)
        return;
    else if (high == low + 1)
    {
        if (list[low] > list[high])
            Swap(ref list[low], ref list[high]);
        return;
    }
    mid = (low + high) >> 1;
    pivot = list[mid];
    Swap(ref list[low], ref list[mid]);
    l = low + 1;
    r = high;
    do
    {
        while (l <= r && list[l] < pivot)
            l++;
        while (list[r] >= pivot)
            r--;
        if (l < r)
            Swap(ref list[l], ref list[r]);
    while (l < r);
    list[low] = list[r];
    list[r] = pivot;
    if (low + 1 < r)
        Sort(list, low, r - 1);
    if (r + 1 < high)
        Sort(list, r + 1, high);
}
 
/// <summary>
/// 交换位置ExchageValue
/// </summary>
/// <param name="l"></param>
/// <param name="r"></param>
private void Swap(ref int l, ref int r)
{
    int temp;
    temp = l;
    l = r;
    r = temp;
}
 
 
/// <summary>
/// 希尔排序
/// </summary>
/// <param name="arr"></param>
public void Sort(int[] arr)
{
    int inc;
    for (inc = 1; inc <= arr.Length / 9; inc = 3 * inc + 1) ;
    for (; inc > 0; inc /= 3)
    {
        for (int i = inc + 1; i <= arr.Length; i += inc)
        {
            int t = arr[i - 1];
            int j = i;
            while ((j > inc) && (arr[j - inc - 1] > t))
            {
                arr[j - 1] = arr[j - inc - 1];//交换数据    
                j -= inc;
            }
            arr[j - 1] = t;
        }
    }
}
 
/// <summary>
/// 基数排序
/// </summary>
/// <param name="arr"></param>
/// <param name="digit"></param>
/// <returns></returns>
public int[] Sort(int[] arr, int digit)
{
    //low to high digit
    for (int k = 1; k <= digit; k++)
    {
        //temp array to store the sort result inside digit
        int[] tmpArray = new int[arr.Length];
        //temp array for countingsort 
        int[] tmpCountingSortArray = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        //CountingSort        
        for (int i = 0; i < arr.Length; i++)
        {
            //split the specified digit from the element 
            int tmpSplitDigit = arr[i] / (int)Math.Pow(10, k - 1) - (arr[i] / (int)Math.Pow(10, k)) * 10;
            tmpCountingSortArray[tmpSplitDigit] += 1;
        }
        for (int m = 1; m < 10; m++)
        {
            tmpCountingSortArray[m] += tmpCountingSortArray[m - 1];
        }
        //output the value to result      
        for (int n = arr.Length - 1; n >= 0; n--)
        {
            int tmpSplitDigit = arr[n] / (int)Math.Pow(10, k - 1) - (arr[n] / (int)Math.Pow(10, k)) * 10;
            tmpArray[tmpCountingSortArray[tmpSplitDigit] - 1] = arr[n];
            tmpCountingSortArray[tmpSplitDigit] -= 1;
        }
        //copy the digit-inside sort result to source array       
        for (int p = 0; p < arr.Length; p++)
        {
            arr[p] = tmpArray[p];
        }
    }
    return arr;
}
0 0
原创粉丝点击