插入排序
直接插入排序
原理
每一个元素插入它前面排序好的元素中
java实现
void inserSort(
int[]
list) {
int j;
for(
int p =
1; p <
list.length; p++ ) {
int temp =
list[p];
for ( j = p; j >
0 && temp -
list[ j -
1] <
0; j--)
list[j] =
list[j-
1];
list[j] = temp;
}
}
希尔排序(缩减增量排序)
原理
对间隔中的数进行直接插入排序排序,间隔慢慢减低,最后到1.
java实现
void shellsort(
int [] a) {
int j;
for (
int gap = a.
length /
2; gap >
0; gap /=
2)
for(
int i = gap; i < a.
length; i++) {
int temp = a[i];
for( j = i; j >= gap &&
temp - a[j-gap] <
0; j-=gap)
a[j] = a[j-gap];
a[j] = temp;
}
}
堆排序
原理
在本人之前的二叉堆这种数据结构的基础上,进行排序。
java实现
public class HeapSort {
public HeapSort(
int [] items ) {
currentSize = items.length;
array =
new int[(currentSize +
2) *
11 /
10];
sorted =
new int[currentSize];
int i =
1;
for(
int item : items)
array[ i++ ] = item;
buildHeap();
}
public void heapsort() {
int i =
0;
while ( currentSize >
0 ) {
sorted[i] =
this.deleteMin();
i++;
}
System.
out.println(
"排序完成");
}
public int deleteMin() {
int minVal = array[
1];
array[
1] = array[ currentSize];
currentSize--;
percolateDown(
1 );
return minVal;
}
private int currentSize;
private int[] array;
private int[] sorted;
private void buildHeap() {
for(
int i = currentSize /
2; i >
0; i-- )
percolateDown( i );
}
private void percolateDown(
int hole) {
int child;
int temp = array[ hole ];
for ( ; hole *
2 <= currentSize; hole = child) {
child = hole *
2;
if ( child != currentSize &&
array[child +
1] - (array[child]) <
0)
child++;
if ( array[child]- temp <
0)
array[hole] = array[child];
else
break;
}
array[hole] = temp;
}
}
归并排序
原理
A,B为排序的列表 c为排序好的列表 x,y指向的数进行对比,小的数保存在c中。z和小的个指针更新自己。若A或B那个先用完,将另一个剩下直接放在c中。
java实现
public class MergeSort {
public MergeSort(
int[]
list) {
sort(
list,
0,
list.length -
1);
}
void sort(
int[]
list,
int left,
int right) {
if (left >= right)
return;
int center = (left + right) /
2;
sort(
list,left, center );
sort(
list, center +
1, right );
merge(
list, left, center, right);
}
void merge(
int[]
list,
int left,
int center,
int right ) {
int[] tempArray =
new int[
list.length];
int rightStart = center +
1;
int leftStart = left;
int third = left;
while( leftStart <= center && rightStart <= right )
if (
list[leftStart] -
list[rightStart] <=
0)
tempArray[third++] =
list[leftStart++];
else
tempArray[third++] =
list[rightStart++];
while ( leftStart <= center )
tempArray[third++] =
list[leftStart++];
while ( rightStart <= right )
tempArray[third++] =
list[rightStart++];
while( left <= right)
list[ left ] = tempArray[ left++ ];
}
}