小挑战
本小节与大家分享一些适合启发新手学习算法的小题目,希望能启发你的斗志!
题目1
你可以使用选择排序给指定整数数组排序吗?
题目2
你可以使用冒泡排序给指定整数数组排序吗?
题目3
你可以使用插入排序给指定整数数组排序吗?
题目4
你可以使用归并排序给指定整数数组排序吗?
题目5
你可以使用快速排序给指定整数数组排序吗?
。。。。。。。。。。。。。我是优美的分割线。。。。。。。。。。。。。
题目1
你可以使用选择排序给指定整数数组排序吗?
public static void selectorSort(int[] array){
if(array==null|| array.length<2){
return;
}
int len = array.length;
for(int i=0; i<len; i++){
int minIndex = i;
for(int j=i+1; j<len; j++){
if(array[j]<array[minIndex]){
minIndex=j;
}
}
swap(array,i,minIndex);
}
}
public static void swap(int[] array,int i1,int i2){
int tmp = array[i1];
array[i1] = array[i2];
array[i2] = tmp;
}
思路:
每一次内存循环找到最小值的下标,内存循环结束交换位置;一直到全部执行完毕
第1轮 从下标0开始,结束后找到的最小值下标,与0下标为数字交换位置
第2轮 从下标1开始,结束后找到的最小值下标,与1下标为数字交换位置
第i轮 从下标i-1开始,结束后找到最小值下标,与i-1下标为数字交换位置
.....
题目2
你可以使用冒泡排序给指定整数数组排序吗?
public static void popSort(int[] array){
if(array==null|| array.length<2){
return;
}
int len = array.length;
for(int i=len-1; i>=0; i--){
for(int j=1; j<=i; j++){
if(array[j-1]>array[j]){
swap(array,j-1,j);
}
}
}
}
public static void swap(int[] array,int i1,int i2){
int tmp = array[i1];
array[i1] = array[i2];
array[i2] = tmp;
}
思路:
两两比较,大的往后移动;
第1轮结束后的最大值处于N-1的位置
第2轮结束后的最大值处于N-2的位置
第i轮结束后的最大值处于N-i的位置
.....
题目3
你可以使用插入排序给指定整数数组排序吗?
public static void insertSort(int[] array){
if(array==null|| array.length<2){
return;
}
int len = array.length;
for(int i=0; i<len; i++){
for (int j = i; j > 0 && array[j - 1] > array[j]; j--) {
swap(array,j-1,j);
}
}
}
}
public static void swap(int[] array,int i1,int i2){
int tmp = array[i1];
array[i1] = array[i2];
array[i2] = tmp;
}
思路:
构建局部有序;
第1轮结束[0,1]的区间有序
第1轮结束[0,2]的区间有序
第i轮结束[0,i]的区间有序
.....
题目4
你可以使用归并排序给指定整数数组排序吗?
参考题解:递归解法
public static void mergeSort(int[] array){
if( array==null || array.length<2 ){
return;
}
process(array, 0, array.length-1);
}
public static void process(int[] array,int l,int r){
if(l >= r){
return;
}
int mid = l+ ((r-l)>>1);
process(array, l, mid);
process(array, mid+1, r);
merge(array, l, mid, r);
}
public static void merge(int[] array,int l,int m,int r){
int [] help = new int[r-l];
int i = 0;
int l1 = l;
int l2 = m+1;
while(l1<=m&& l2<=r){
help[i++] = array[l1]<=array[l2]?array[l1++]:array[l2++];
}
while(l<=m){
help[i++] = array[l1++];
}
while(l2<=r){
help[i++] = array[l2++];
}
for(i=0;i<help.length;i++){
array[l+i] =help[i];
}
}
题目5
你可以使用快速排序给指定整数数组排序吗?
参考题解: 递归解法
public static void quickSort(int[] array){
if( array==null || array.length<2 ){
return;
}
process(array, 0, array.length-1);
}
public static void process(int[] array,int l,int r){
if(l >= r){
return;
}
int[] partition = partition(array, l, r);
process(array, l, partition[0]);
process(array, partition[1], r);
}
public static int[] partition(int[] array, int l, int r){
int less = l-1;
int more = r;
int index = l;
while(index < more){
if(array[index] < array[r]){
swap(array, ++less, index++);
}else if(array[index] > array[r]){
swap(array, --more, index);
}else {
index++;
}
}
swap(array,index,r);
return new int[]{less,more};
}
public static void swap(int[] array, int i1, int i2){
int tmp = array[i1];
array[i1] = array[i2];
array[i2] = tmp;
}
- 本文链接: https://www.sunce.wang/archives/suan-fa-xiao-lian-xi-zhi-pai-xu-zhuan-ti
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!