常见经典排序算法的java实现

来源:互联网 发布:《大数据时代》 编辑:程序博客网 时间:2024/04/29 17:50

public class Sort {// =======================选择排序Begin========================void select_sort(int[] array) {for (int i = 0; i < array.length - 1; i++) {int minIndex = i;for (int j = i + 1; j < array.length; j++) {if (array[minIndex] > array[j]) {minIndex = j;}}if (minIndex != i) {int temp = array[minIndex];array[minIndex] = array[i];array[i] = temp;}}}// =======================选择排序End===========================// =======================冒泡排序——大泡下沉Begin=============void bubble_sort(int[] array) {for (int i = array.length - 1; i > 0; i--) {for (int j = 0; j < i; j++) {int temp = 0;if (array[j] > array[j + 1]) {temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}// ======================冒泡排序——大泡下沉End================// ======================冒泡排序——小泡上浮Begin==============void bubbleSort(int[] array) {for (int i = 0; i < array.length; i++) {for (int j = array.length - 1; j > i; j--) {int temp = 0;if (array[j] < array[j - 1]) {temp = array[j];array[j] = array[j - 1];array[j - 1] = temp;}}}}// ======================冒泡排序——小泡上浮End================// ======================直接插入排序Begin======================void insertion_sort(int[] unsorted) {for (int i = 1; i < unsorted.length; i++) {if (unsorted[i - 1] > unsorted[i]) {int temp = unsorted[i];int j = i;while (j > 0 && unsorted[j - 1] > temp) {unsorted[j] = unsorted[j - 1];j--;}unsorted[j] = temp;}}}// =======================直接插入排序End======================// ========================快速排序1Begin======================int partition(int[] unsorted, int low, int high) {int pivot = unsorted[low];while (low < high) {while (low < high && unsorted[high] > pivot)high--;unsorted[low] = unsorted[high];while (low < high && unsorted[low] <= pivot)low++;unsorted[high] = unsorted[low];}unsorted[low] = pivot;return low;}void quick_sort(int[] unsorted, int low, int high) {int loc = 0;if (low < high) {loc = partition(unsorted, low, high);quick_sort(unsorted, low, loc - 1);quick_sort(unsorted, loc + 1, high);}}// =======================快速排序1End========================// =======================快速排序2Begin======================// 快速排序一次划分int Partition(int r[], int first, int end) {int i = first; // 初始化int j = end;int temp;while (i < j) {while (i < j && r[i] <= r[j])j--; // 右侧扫描if (i < j) {temp = r[i]; // 将较小记录交换到前面r[i] = r[j];r[j] = temp;i++;}while (i < j && r[i] <= r[j])i++; // 左侧扫描if (i < j) {temp = r[j];r[j] = r[i];r[i] = temp; // 将较大记录交换到后面j--;}}return i; // i为轴值记录的最终位置}// 快速排序void QuickSort(int r[], int first, int end) {if (first < end) { // 递归结束int pivot = Partition(r, first, end); // 一次划分QuickSort(r, first, pivot - 1); // 递归地对左侧子序列进行快速排序QuickSort(r, pivot + 1, end); // 递归地对右侧子序列进行快速排序}}// =======================快速排序2End========================// =======================堆排序1Begin========================// array是待调整的堆数组,i是待调整的数组元素的位置,length是数组的长度void HeapAdjust(int array[], int i, int nLength) {int nChild, nTemp;for (nTemp = array[i]; 2 * i + 1 < nLength; i = nChild) {// 子结点的位置是 父结点位置 * 2 和父节点位置*2+1 // 修改处nChild = 2 * i + 1;// 得到子结点中较大的结点if (nChild != nLength - 1 && array[nChild + 1] > array[nChild])++nChild;// 如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点if (nTemp < array[nChild]) {array[i] = array[nChild];} else // 否则退出本次循环{break;}}// 最后把需要调整的元素值放到合适的位置array[i] = nTemp;}// 堆排序算法void HeapSort(int array[], int length) {// 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素for (int i = length / 2 - 1; i >= 0; --i) {HeapAdjust(array, i, length);}// 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素4for (int i = length - 1; i > 0; --i) {// 把第一个元素和当前的最后一个元素交换,保证当前的最后一个位置的元素都是在现在的这个序列之中最大的int tem = array[0];array[0] = array[i];array[i] = tem;// 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值HeapAdjust(array, 0, i);}}// =========================堆排序1End==============================// =========================堆排序2Begin============================void heapAdjust(int a[], int i, int n) {int tem;int min_p = 2 * i;if (2 * i < n) {min_p = 2 * i;}if (2 * i + 1 < n) {if (a[2 * i + 1] > a[2 * i]) {min_p = 2 * i + 1;}}if (a[min_p] > a[i]) {tem = a[min_p];a[min_p] = a[i];a[i] = tem;if (2 * min_p < n)heapAdjust(a, min_p, n);}}void Heap_sort(int a[], int n) {int i, tem;for (i = n / 2 - 1; i >= 0; i--) {heapAdjust(a, i, n);}for (i = 0; i < n - 1; i++) {tem = a[0];a[0] = a[n - i - 1];a[n - i - 1] = tem;heapAdjust(a, 0, n - i - 1);}}// ========================堆排序2End========================// ========================基数排序Begin=====================/** * 基数排序 结合桶式排序,分两种从高位到低位和从低位到高位。案例代码为从低位到高位 第一步:得到数组内最大位数 第二步:进行多次 * 桶式排序,次数为排序最大数字的位数 例子:52,38,23,72,271 第一步:数组元素最大位数为3, * 第二步:第一次桶式排序,针对数组元素的个位:排序结果为:271,52,72,23,38,按个位桶式排序就完成了 继续: * 第二次桶式排序,按照数组元素的十位:排序结果为:23,38,52,271,72 继续: * 第三次桶式排序,按照数组元素的百位:排序结果为:23,38,52,72,271 排序完成。 *  * @author *  */void radixSort(int[] array) {int maxW = 0;int index = 0;// 第一步:得到数组内最大元素的位数for (int i = 0; i < array.length; i++) {if (maxW < array[i]) {maxW = array[i];}}maxW = getNumberLength(maxW);// 第二步:进行多次 桶式排序,次数为排序最大数字的位数while (index < maxW) {int[] tempArray = new int[array.length];int[] bucketArray = new int[10];System.arraycopy(array, 0, tempArray, 0, array.length);for (int i = 0; i < array.length; i++) {bucketArray[getNumberIndex(index, array[i])]++;}for (int i = 1; i < bucketArray.length; i++) {bucketArray[i] = bucketArray[i] + bucketArray[i - 1];}for (int i = array.length - 1; i >= 0; i--) {array[--bucketArray[getNumberIndex(index, tempArray[i])]] = tempArray[i];}index++;}}int getNumberIndex(int index, int number) {int num = 0;num = (int) (number / Math.pow(10, index)) % 10;return num;}int getNumberLength(int number) {int count = 1;int index = 1;while ((number - Math.pow(10, index)) > 0) {// Math.pow(x,y)计算x的y次幂count++;index++;}return count;}// =======================基数排序End==========================// =======================归并排序Begin========================//将有二个有序数列a[first...mid]和a[mid...last]合并。 void merge(int[] unsorted, int first, int mid, int last, int[] sorted) {int i = first, j = mid;int k = 0;while (i < mid && j < last)if (unsorted[i] < unsorted[j]) {sorted[k++] = unsorted[i++];} else if (unsorted[i] > unsorted[j]) {sorted[k++] = unsorted[j++];} else {sorted[k++] = unsorted[i++];sorted[k++] = unsorted[j++];}while (i < mid)sorted[k++] = unsorted[i++];while (j < last)sorted[k++] = unsorted[j++];for (int v = 0; v < k; v++)unsorted[first + v] = sorted[v];}void merge_sort(int[] unsorted, int first, int last, int[] sorted) {if (first + 1 < last) {int mid = (first + last) / 2;merge_sort(unsorted, first, mid, sorted);//左边有序 merge_sort(unsorted, mid, last, sorted);//右边有序merge(unsorted, first, mid, last, sorted);//再将二个有序数列合并 }}// =========================归并排序End========================// =========================希尔排序Begin======================void shell_sort(int[] array) {int groupLen = 0;int len = array.length;for (groupLen = len / 2; groupLen > 0; groupLen /= 2) {for (int i = 0; i < len - groupLen; i++) {for (int j = i; j < len - groupLen; j += groupLen) {if (array[j] > array[j + groupLen]) {int temp = array[j];array[j] = array[j + groupLen];array[j + groupLen] = temp;}}}}}// =====================希尔排序End==========================/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSort sort = new Sort();System.out.println("*********************选择排序*********************");int[] selectArray = { 6, 3, 2, 7, 4, 8, 1, 5, 9 };sort.select_sort(selectArray);print(selectArray);System.out.println("*********************冒泡排序**********************");int[] bubbleArray = { 6, 3, 2, 7, 4, 8, 1, 5, 9 };sort.bubble_sort(bubbleArray);// sort.bubbleSort(bubbleArray);print(bubbleArray);System.out.println("*********************直接插入排序******************");int[] x = { 6, 3, 2, 7, 4, 8, 1, 5, 9 };sort.insertion_sort(x);print(x);System.out.println("*********************快速排序**********************");int[] quickArray = { 6, 3, 2, 7, 4, 8, 1, 5, 9 };// sort.quick_sort(x, 0, x.length - 1);sort.QuickSort(quickArray, 0, quickArray.length - 1);print(quickArray);System.out.println("*********************堆排序************************");int a[] = { 71, 18, 151, 138, 160, 63, 174, 169, 79, 78 };sort.HeapSort(a, a.length);// sort.Heap_sort(a, a.length);print(a);System.out.println("*********************基数排序***********************");int[] array = new int[] { 51, 82, 23, 94, 35, 76, 117, 238, 909, 40, 11 };sort.radixSort(array);print(array);System.out.println("*********************归并排序***********************");int[] mergeArray = { 6, 3, 2, 7, 4, 8, 1, 5, 9 };int[] sorted = new int[mergeArray.length];sort.merge_sort(mergeArray, 0, mergeArray.length, sorted);print(mergeArray);System.out.println("*********************希尔排序***********************");int[] shellArray = { 6, 3, 2, 7, 4, 8, 1, 5, 9 };sort.shell_sort(shellArray);print(shellArray);}static void print(int[] a) {for (int i = 0; i < a.length; i++) {if (i == a.length - 1)System.out.println(a[i]);elseSystem.out.print(a[i] + ",");}System.out.println("**********************end****************************");}}



递归排序的示例图:


原创粉丝点击