java面试排序都考哪几种排序_java算法面试题:排序都有哪几种方法?

3c3db003cb602b64d90448befb03f215.png

慕函数4003404

一、冒泡排序[java] view plain copypackage sort.bubble;import java.util.Random;/*** 依次比较相邻的两个数,将小数放在前面,大数放在后面* 冒泡排序,具有稳定性* 时间复杂度为O(n^2)* 不及堆排序,快速排序O(nlogn,底数为2)* @author liangge**/public class Main {public static void main(String[] args) {Random ran = new Random();int[] sort = new int[10];for(int i = 0 ; i < 10 ; i++){sort[i] = ran.nextInt(50);}System.out.print("排序前的数组为");for(int i : sort){System.out.print(i+" ");}buddleSort(sort);System.out.println();System.out.print("排序后的数组为");for(int i : sort){System.out.print(i+" ");}}/*** 冒泡排序* @param sort*/private static void buddleSort(int[] sort){for(int i=1;isort[j+1]){int temp = sort[j+1];sort[j+1] = sort[j];sort[j] = temp;}}}}}二、选择排序[java] view plain copypackage sort.select;import java.util.Random;/*** 选择排序* 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,* 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。* 选择排序是不稳定的排序方法。* @author liangge**/public class Main {public static void main(String[] args) {Random ran = new Random();int[] sort = new int[10];for (int i = 0; i < 10; i++) {sort[i] = ran.nextInt(50);}System.out.print("排序前的数组为");for (int i : sort) {System.out.print(i + " ");}selectSort(sort);System.out.println();System.out.print("排序后的数组为");for (int i : sort) {System.out.print(i + " ");}}/*** 选择排序* @param sort*/private static void selectSort(int[] sort){for(int i =0;i key && j > start) {j--;}while (sort[i] < key && i < end) {i++;}if (i < j) {int temp = sort[i];sort[i] = sort[j];sort[j] = temp;}}// 如果左边索引比右边索引要大,说明第一次排序完成,将sort[j]与key对换,// 即保持了key左边的数比key小,key右边的数比key大if (i > j) {int temp = sort[j];sort[j] = sort[start];sort[start] = temp;}//递归调用if (j > start && j < end) {quickSort(sort, start, j - 1);quickSort(sort, j + 1, end);}}}[java] view plain copy/*** 快速排序** @param a* @param low* @param high* voidTest*/public static void kuaisuSort(int[] a, int low, int high){if (low >= high){return;}if ((high - low) == 1){if (a[low] > a[high]){swap(a, low, high);return;}}int key = a[low];int left = low + 1;int right = high;while (left < right){while (left < right && left <= high)// 左边向右{if (a[left] >= key){break;}left++;}while (right >= left && right > low){if (a[right] <= key){break;}right--;}if (left < right){swap(a, left, right);}}swap(a, low, right);kuaisuSort(a, low, right);kuaisuSort(a, right + 1, high);}四、插入排序[java] view plain copypackage sort.insert;/*** 直接插入排序* 将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据* 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。*/import java.util.Random;public class DirectMain {public static void main(String[] args) {Random ran = new Random();int[] sort = new int[10];for (int i = 0; i < 10; i++) {sort[i] = ran.nextInt(50);}System.out.print("排序前的数组为");for (int i : sort) {System.out.print(i + " ");}directInsertSort(sort);System.out.println();System.out.print("排序后的数组为");for (int i : sort) {System.out.print(i + " ");}}/*** 直接插入排序** @param sort*/private static void directInsertSort(int[] sort) {for (int i = 1; i < sort.length; i++) {int index = i - 1;int temp = sort[i];while (index >= 0 && sort[index] > temp) {sort[index + 1] = sort[index];index--;}sort[index + 1] = temp;}}}顺便添加一份,差不多的[java] view plain copypublic static void charuSort(int[] a){int len = a.length;for (int i = 1; i < len; i++){int j;int temp = a[i];for (j = i; j > 0; j--)//遍历i之前的数字{//如果之前的数字大于后面的数字,则把大的值赋到后面if (a[j - 1] > temp){a[j] = a[j - 1];} else{break;}}a[j] = temp;}}把上面整合起来的一份写法:[java] view plain copy/*** 插入排序:**/public class InsertSort {public void sort(int[] data) {for (int i = 1; i < data.length; i++) {for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {swap(data, j, j - 1);}}}private void swap(int[] data, int i, int j) {int temp = data[i];data[i] = data[j];data[j] = temp;}}五、顺便贴个二分搜索法[java] view plain copypackage search.binary;public class Main {public static void main(String[] args) {int[] sort = {1,2,3,4,5,6,7,8,9,10};int mask = binarySearch(sort,6);System.out.println(mask);}/*** 二分搜索法,返回座标,不存在返回-1* @param sort* @return*/private static int binarySearch(int[] sort,int data){if(datasort[sort.length-1]){return -1;}int begin = 0;int end = sort.length;int mid = (begin+end)/2;while(begin <= end){mid = (begin+end)/2;if(data > sort[mid]){begin = mid + 1;}else if(data < sort[mid]){end = mid - 1;}else{return mid;}}return -1;}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值