常用排序算法Word格式文档下载.docx
《常用排序算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《常用排序算法Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
16.
array
待排序的数组
17.
from
从哪里开始排序
18.
end
排到哪里
19.
c
比较器
20.
21.
public
void
sort(E[]
array,
int
from,
end,
Comparator<
c)
22.
//需array.length
-
1轮比较
23.
for
(int
k
=
1;
+
k++)
24.
//每轮循环中从最后一个元素开始向前起泡,直到i=k止,即i等于轮次止
25.
i
from;
k;
i--)
26.
//按照一种规则(后面元素不能小于前面元素)排序
27.
if
(pare(array[i],
array[i
1])
0)
28.
//如果后面元素小于了(当然是大于还是小于要看比较器实现了)前面的元素,则前后交换
29.
swap(array,
i,
1);
30.
}
31.
32.
33.
34.
35.
36.
测试
37.
args
38.
39.
static
main(String[]
args)
40.
Integer[]
intgArr
7,
2,
4,
3,
12,
1,
9,
6,
8,
5,
11,
10
};
41.
Integer>
sort
new
();
42.
BubbleSort.testSort(sort,
intgArr);
43.
null);
44.
45.}
快速排序
快速排序采用了分治法的思想,把大的问题分解为同类型的小问题。
一般分如下步骤:
1)选择一个中枢元素(有很多选法,我的实现里使用第一个元素为中枢的简单方法)
2)以该中枢元素为基准点,将小于中枢的元素放在中枢后集合的前部分,比它大的在集合后部分,待集合基本排序完成后(此时前部分元素小于后部分元素),把中枢元素放在合适的位置。
3)根据中枢元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。
这里的重点与难点在于第二步,实现的方式有很多种,我这里实现了三种。
第一种实现(partition1方法):
以第一个元素为中枢元素,在中枢元素后面集合中从前往后寻找第一个比中枢元素小的元素,并与第一个元素交换,然后从剩余的元素中寻找第二个比中枢元素小的元素,并与第二位元素交换,这样直到所有小于中枢元素找完为止,并记下最后一次放置小于中枢的元素位置minIndex(即小于中枢与大于中枢的分界),并将中枢元素与minIndex位置元素互换,然后对中枢元素两边的序列进行同样的操作。
此种实现最为简洁,处理过程中不需要把中枢元素移来移去,只是在其它元素完成基本排序后(前部分小于后部分元素)再把中枢元素放置到适当的位置
第二种实现(partition2方法):
以第一个元素为中枢元素,刚开始时使用低指针指向中枢元素。
当中枢元素在低指针位置时,此时我们判断高指针指向的元素是否小于中枢元素,如果大于中枢元素则高指针继续向头移动,如果小于则与中枢元素交换,此时中枢元素被移到了高指针位置;
当中枢元素在高指针位置时,我们此时判断低指针指向的元素是否大于中枢元素,如果小于中枢元素则低指针继续向尾移动,如果大于则与中枢元素交换,此时中枢元素又回到了低指针位置;
这时是拿高还是低指针所指向的元素与中枢比较时根据前面逻辑来处理,直到高低指针指向同一位置则完成一轮排序,然后再对中枢元素两边的序列进行同样的操作直到排序完成
此种实现逻辑比较好理解,中枢元素的永远在低指针或指针所指向的位置,每次找到需处理的元素后,要与中枢交换,中枢就像皮球一样从这里踢到那里,又从那里踢到这里。
但此种实现会频繁地交换中枢元素,性能可能不如第一种
第三种实现(partition3方法):
此种方式与前两种方式不太一样,同时移动高低指针,低指针向尾找出大于等于中枢的元素,而高向头找出小于中枢的元素,待两者都找出后交换高低指针所指向的元素,直到高低指针指向同一位置止,然后比较中枢与高低指针所指向的元素大小,如果中枢元素大,则直接与高低指针元素交换,如果中枢元素小于等于高低指针元素,则中枢元素与高低指针前一元素交换,完成一轮比较,然后再对中枢元素两边的序列进行同样的操作直到排序完成
此种方式有点难度,在移动元素时要注意的是:
与中枢相等的元素也要向集合后部移动,不然的话如[3,3,0,3,3]第一轮排序结果不准确,虽然最后结果正确。
当中枢后面的元素集合移动完成后,还得要把中枢元素放置在集合中的合适位置,这就需要找准集合中前部分与后部分的边界,最后只能把中枢元素与最后一个小于中枢的元素进位置互换。
但此种实现方式与第一种有点像,也不需要把中枢元素调来调去的,而是待后面集合排序完成后将中枢放入适当位置
java.util.Arrays;
4.import
5.
6./**
快速排序算法
12.
13.public
QuickSort<
quickSort(array,
c);
递归快速排序实现
待排序数组
low
低指针
high
高指针
private
quickSort(E[]
low,
high,
/*
如果分区中的低指针小于高指针时循环;
如果low=higth说明数组只有一个元素,无需再处理;
如果low
higth,则说明上次枢纽元素的位置pivot就是low或者是higth,此种情况
下分区不存,也不需处理
(low
high)
//对分区进行排序整理
pivot
partition1(array,
以pivot为边界,把数组分成三部分[low,
1]、[pivot]、[pivot
high]
其中[pivot]为枢纽元素,不需处理,再对[low,
1]与[pivot
45.
各自进行分区排序整理与进一步分区
46.
47.
48.
49.
50.
51.
52.
53.
54.
实现一
55.
56.
57.
58.
59.
60.
@return
调整后中枢位置
61.
62.
partition1(E[]
63.
pivotElem
array[low];
//以第一个元素为中枢元素
64.
//从前向后依次指向比中枢元素小的元素,刚开始时指向中枢,也是小于与大小中枢的元素的分界点
65.
border
low;
66.
67.
68.
在中枢元素后面的元素中查找小于中枢元素的所有元素,并依次从第二个位置从前往后存放
69.
注,这里最好使用i来移动,如果直接移动low的话,最后不知道数组的边界了,但后面需要
70.
知道数组的边界
71.
72.
high;
i++)
73.
//如果找到一个比中枢元素小的元素
74.
pivotElem)
75.
++border,
i);
//border前移,表示有小于中枢元素的元素
76.
77.
78.
79.
如果border没有移动时说明说明后面的元素都比中枢元素要大,border与low相等,此时是
80.
同一位置交换,是否交换都没关系;
当border移到了high时说明所有元素都小于中枢元素,此
81.
时将中枢元素与最后一个元素交换即可,即low与high进行交换,大的中枢元素移到了
序列最
82.
后;
如果
minIndex<
high,表
明中枢后面的元素前部分小于中枢元素,而后部分大于
83.
中枢元素,此时中枢元素与前部分数组中最后一个小于它的元素交换位置,使得中枢元素放置在
84.
正确的位置
85.
86.
border,
low);
87.
return
border;
88.
89.
90.
91.
实现二
92.
93.
94.
待排序区低指针
95.
待排序区高指针
96.
97.
98.
99.
partition2(E[]
100.
//中枢元素位置,我们以第一个元素为中枢元素
101.
//退出条件这里只可能是
102.
while
(true)
103.
(pivot
!
{//如果中枢元素在低指针位置时,我们移动高指针
104.
//如果高指针元素小于中枢元素时,则与中枢元素交换
105.
(pare(array[high],
array[pivot])
106.
pivot);
107.
//交换后中枢元素在高指针位置了
108.
109.
else
{//如果未找到小于中枢元素,则高指针前移继续找
110.
high--;
111.
112.
{//否则中枢元素在高指针位置
113.
//如果低指针元素大于中枢元素时,则与中枢元素交换
114.
(pare(array[low],
115.
116.
//交换后中枢元素在低指针位置了
117.
118.
{//如果未找到大于中枢元素,则低指针后移继续找
119.
low++;
120.
121.
122.
==
123.
break;
124.
125.
126.
//返回中枢元素所在位置,以便下次分区
127.
pivot;
128.
129.
130.
131.
实现三
132.
133.
134.
135.
136.
137.
138.
139.
partition3(E[]
140.
141.
142.
//----调整高低指针所指向的元素顺序,把小于中枢元素的移到前部分,大于中枢元素的移到后面部分
143.
144.
145.
146.
//如果高指针未超出低指针
147.
148.
//如果低指针指向的元素大于或等于中枢元素时表示找到了,退出,注:
等于时也要后移
149.
150.
151.
{//如果低指针指向的元素小于中枢元素时继续找
152.
153.
154.
155.
156.
(high
low)
157.
//如果高指针指向的元素小于中枢元素时表示找到,退出
158.
159.
160.
{//如果高指针指向的元素大于中枢元素时继续找
161.
162.
163.
164.
//退出上面循环时
165.
166.
167.
168.
169.
high);
170.
171.
172.
//----高低指针所指向的元素排序完成后,还得要把中枢元素放到适当的位置
173.
(pare(array[pivot],
array[low])
174.
//如果退出循环时中枢元素大于了低指针或高指针元素时,中枢元素需与low元素交换
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
1
192.
193.
QuickSort.testSort(sort,
194.
195.
196.}
归并排序
java.lang.reflect.Array;
6.