算法代码实现(java版)
排序
常见的排序列表:
中文名称
|
英文名称
|
平均时间复杂度
|
最坏时间复杂度
|
最好时间复杂度
|
空间复杂度
|
稳定性
|
选择排序
| Selection |
n^2
|
n^2
|
n^2
|
1
|
不稳
|
冒泡排序
| Bubble | n^2 |
n^2
|
n
|
1
|
稳
|
插入排序
| Insertion | n^2 |
n^2
|
n
|
1
| 稳 |
堆排序
|
heap
|
nlog2n
|
nlog2n
|
nlog2n
|
1
|
不稳
|
希尔排序
|
Shell
| n^1.3 |
n^2
|
n
|
1
|
不稳
|
归并排序
|
Merge
|
nlog2n
|
nlog2n
|
nlog2n
|
n
|
稳
|
快速排序
|
Quick
|
nlog2n
|
n^2
|
nlog2n
|
log2n
|
不稳
|
桶排序
|
Bucket
|
n+k
|
n^2
|
n
|
n+k
|
稳
|
计数排序
| Counting |
n+k
|
n+k
|
n+k
|
n+k
|
稳
|
基数排序
|
Radix
|
n*k
|
n*k
|
n*k
|
n+k
|
稳
|
最重要的:插入排序,堆排序,归并排序,快速排序。
如何写算法程序:
1.由简单到复杂:验证一步走一步,多打印中间结果。
2.先局部后整体:没思路时先细分。
3.先粗糙后精细:变量名更改,语句合并,边界处理。
代码实现我们这里会使用java语言。
选择排序的代码实现(Selection):
第一次我们会以一个非常简单的方式带你入门。
第一步:自然是创建一个类我们把他取名为 MySelectionSort
public class MySelectionSort{
public static void main (String[] args){
//定义一个数组有10个数
int arr[] = {7,8,9,1,2,5,6,3,4,0};
//打印出数组
for(int i=0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
}
}
那么你打印出的结果自然是:7 8 9 1 2 5 6 3 4 0
第二步:我们在原来的基础上找到其中最小的数,实现方法就是先假定第一个数为最小的数,然后一 一与后面的数字进行比较,如果比第一个数大则继续往后比较
如果比第一个数小则俩者互换。
public class MySelectionSort{
public static void main (String[] args){
//定义一个数组有10个数
int arr[] = {7,8,9,1,2,5,6,3,4,0};
//假设第一个数为最小数
int minPros = 0;
for(int j = 1;j<arr.length;j++){
if(arr[minPros]>arr[j]){
minPros = j;
}
}
System.out.println(arr[minPros]);
//打印出数组
int temp = arr[0];
arr[0] = arr[minPros];
arr[minPros] = temp;
for(int i=0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
}
}
打印结果为:
0
0 8 9 1 2 5 6 3 4 7
既然可以知道最小的数为0
第三步:那么我们想要把数组进行选择排序,可知道,只需要把每一次的输出的最小的数打印出来即可,即在外面套一层循环
public class MySelectionSort{
public static void main (String[] args){
//定义一个数组有10个数
int arr[] = {7,8,9,1,2,5,6,3,4,0};
//假设第一个数为最小数
for (int i=0;i< arr.length;i++){
int minPros = i;
for(int j =i+1;j<arr.length;j++){
if(arr[minPros]>arr[j]) {
minPros = j;
}
}
int temp = arr[i];
arr[i] = arr[minPros];
arr[minPros] = temp;
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
}
}
输出结果为:0 1 2 3 4 5 6 7 8 9
冒泡排序(Bubble):
基本概念:下面我们定义一个数组,如:
9
|
7
|
5
|
4
|
6
|
8
|
3
|
0
|
2
|
1
|
对它进行冒泡排序其实非常简单,接下来让我们简单的来实现它一下。
第一步:
我们可以从左边或者右边开始都可以,大数往下沉的就是左边开始,小数往下沉的就是右边开始。
我们先把9与7进行对比会发现9>7。所以俩个数进行交换。这时9来到了1的位置,然后9与5对比
9>5。所以俩者交换。同理依次进行交换直到最后。得到数组为:7 5 4 6 8 3 0 2 1 9
这里需要特别注意的是此操作是你可以想象一把天平从左往右,俩俩进行比较而不是第一个数与所有进行比较。
接下来我们进行代码实现:
public class MyBubbleSort {
public static void main(String[] args) {
int[] arr={9,7,5,4,6,8,3,0,2,1};
for (int i = 0; i < 9; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]);
}
}
}
输出结果:7546830219
第二步:我们将第一轮排序好后,接下来将会继续进行一轮冒泡排序:
5 7 4 6 8 3 0 2 1 9
5 4 7 6 8 3 0 2 1 9
5 4 6 7 8 3 0 2 1 9
5 4 6 7 8 3 0 2 1 9
5 4 6 7 3 8 0 2 1 9
5 4 6 7 3 0 8 2 1 9
5 4 6 7 3 0 2 8 1 9
5 4 6 7 3 0 2 1 8 9
得到以上过程,由此你可以发现冒泡排序的过程就好像一把天平,左右一次只能放一个数然后进行对比,把当左天平小于右天平时,
俩者进行对调,反之不需要调整,然后天平继续往右移动以此类推一直到最右时,在把天平移动回最左边,继续排序,以此类推。
那么我们要实现此代码并不难只需要在for循环的外层在套一层for(int j=arr.length-1;j>0;j--),这里需要注意的是j的开始定义为arr.length-1,而不是arr.length。
且i<9,而不是i<10,否则会出现长度的报错。
public class MyBubbleSort {
public static void main(String[] args) {
int[] arr={9,7,5,4,6,8,3,0,2,1};
for (int j=arr.length-1;j>0;j--){
for (int i = 0; i < 9; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]);
}
}
}
输出结果:0123456789
插入排序(Insertion):
对于基本有序的数组最好用,且是稳定的。
基本概念:
我们来介绍一下插入排序的基本概念。假如我们有一段数据如下:
9
|
6
|
1
|
3
|
5
|
假如我们对它进行插入排序。首先我们需要确定一个已排好的位置,假设我们先确定好9的位置,然后在1的为即6与数字9进行比较。
如果左边的数6,小于已经确定好位置的数字9,那么俩数对调,得到数组:
6
|
9
|
1
|
3
|
5
|
然后6已是左边最小的数所以第一轮排序结束,接着我们在左边的第二个数1,与已排好的数据6,9中的9先进行比较,同理1<9,所以
对换,然后在用1往左走与6比较,1<6,所以对换。得到数组如下:
1
|
6
|
9
|
3
|
5
|
同理像上述操作一样,继续进行排序。最后即可得到排好的数组:
1
|
3
|
5
|
6
|
9
|
接下来我们来看一下代码实现:
public class Insertion {
public static void main(String[] args) {
int[] a = {9,7,5,3,2,4,1,0,6,8};
sort(a);
print(a);
}
static void sort (int[] a){
for(int i=1;i<a.length;i++){
for(int j=i;j>0;j--){
if(a[j] < a[j-1]){
swap(a,j,j-1);
}
}
}
}
static void swap (int[] a,int i,int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
static void print (int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]);
}
}
}
输出结果:0123456789
其他等下次再写吧。感谢!