#排序算法
###1、基本介绍
排序算法比较基础,但是设计到很多计算机科学的想法,如下:
1、比较和非比较的策略
2、迭代和递归的实现
3、分而治之思想
4、最佳、最差、平均情况时间复杂度分析
5、随机算法
1,冒泡排序
特点:效率低,实现简单思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。这只是冒泡排序的一种,当然也可以从后往前排。
public void bubbleSort(int array[]) {
int t = 0;
for (int i = 0; i < array.length - 1; i++) for (int j = 0; j < array.length - 1 - i; j++)
if (array[j] > array[j + 1]) {
t = array[j];
array[j] = array[j + 1];
array[j + 1] = t;
}
}
2,选择排序特点:效率低,容易实现。思想:每一趟从待排序序列选择一个最小的元素放到已排好序序列的末尾,剩下的为待排序序列,重复上述步骤直到完成排序。public void selectSort(int array[]) {
int t = 0;
for (int i = 0; i < array.length - 1; i++){
int index=i;
for (int j = i + 1; jvarray.length; j++)
if (array[index] > array[j]) index=j;
if(index!=i){
//找到了比array[i]小的则与array[i]交换位置
t = array[i];
array[i] = array[index]; array[index] = t;
}
}
}
3. 直接插入排序(Straight Insertion Sorting)的基本思想:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过为止。
首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入。
设定插入数和得到已经排好序列的最后一个数的位数。insertNum和j=i-1。
从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动一位。
将当前数放置到空着的位置,即j+1。
/**
* 直接插入排序
* 时间复杂度O(n²) 空间复杂度O(1)
*/
public static void straightInsertion(int[] arr) {
int current;//要插入的数
for (int i = 1; i < arr.length; i++) { //从1开始 第一次一个数不需要排序
current = arr[i];
int j = i - 1;//序列元素个数
while (j >= 0 && arr[j] > current) {//从后往前循环,将大于当前插入数的向后移动
arr[j + 1] = arr[j];//元素向后移动
j--;
}
arr[j + 1] = current;//找到位置,插入当前元素
}
}
- 希尔排序
是插入排序的一种高速而稳定的改进版本。
希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
/**
* 希尔排序
* 时间复杂度O(n²) 空间复杂度O(1)
*/
public static void shellSort(int[] arr) {
int gap = arr.length / 2;
for (; gap > 0; gap = gap / 2) {
//不断缩小gap,直到1为止
for (int j = 0; (j + gap) < arr.length; j++) {
//使用当前gap进行组内插入排序
for (int k = 0; (k + gap) < arr.length; k += gap) {
if (arr[k] > arr[k + gap]) {
//交换操作
int temp = arr[k];
arr[k] = arr[k + gap];
arr[k + gap] = temp;
}
}
归并排序
#井#井 (1)归并排序的介绍
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConguer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
#并井井 (2)归并排序的原理
1、将每对单个元素(默认情况下,已排序)归并为2个元素的有序数组,
2、将2个元素的每对有序数组归并成4个元素的有序数组,重复这个过程…,
3、最后一步:归并2个N/2元素的排序数组(为了简化讨论,我们假设N是偶数)以获得完全排序的N个元素数组。
*java
public static int[] MergeSortCint[] array)(
if (array.length<2) return
array;
int mid = array.length/2;
int[] left=
Arrays.copyOfRange(array, O, mid);
int[] right=
Arrays. copyOfRange(array, mid, arrny.length);
return merge(MergeSort(left), MergeSort(right));
public static int[] mergeCint[]left,int[] right)(
int[] result = new
int[left.length + right.length];
for Cint index=0, i=0,j=0;index<result.length; index++)( if (i >= left.length)
else if (j >= right.length) result[index] = left[i++];
else if (left[i] > right[j]) result[index] = right[j++];
else
result[index] = left[i++];
}
return result;
}