排序
排序是数据处理中十分常见的且核心的操作,简单介绍最基础的三种排序:冒泡排序、直接插入排序、选择排序。
1、冒泡排序
冒泡排序是在一堆大小不一的数中,对这些不同的值进行排序所用的一种方法,它是将相邻的两个数相比较,前面的一个数比后面的一个数大(小),则这两个数交换位置,每一趟会将最小(或最大)的元素“浮”到顶端,最终达到完全有序。
代码实现
public class Test1{
public static void bubbleSort(int[] array){
int tmp = 0;
boolean swap = flase; //优化设置一个标志,来判断是否有交换
for(int i = 0;i < array.length - 1; i++){
for(int j = 0;j < array.length - i -1; j++){
if(array[j] > array[j+1]){
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
swpa = true;
}
}
if(!swap) {
break;
}
}
}
public static void main(String[] args){
int array[] = {1,2,5,3,6,9,7};
System.out.println(Arrays.toString(array));
}
}
在冒泡排序中,若原来的数组是有序的,也就是最好的情况下,仅需n-1次比较就可完成,时间复杂度为:O(n).
若是倒序,也就是最坏的情况下,需要(n-1)+(n-2)+…+1=n(n-1)/2,时间复杂度为O(n^2).
稳定性:稳定
性能低于选择排序
2、直接插入排序(shell排序)
直接插入排序就是每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列中的合适位置,直到全部插入。
代码实现
public class Test1{
public static void insertSort(int[] array){ //直接插入
int tmp = 0;//临时量
for(int i = 1;i <= array.length;i++ ){ //i从1开始
tmp = array[i];//将array[i]的值放在tmp
for(int j = i - 1;j >= i - 1;j --){ //j是i前面的值
if(array[j] > tmp) {
array[j + 1] = array[j];
}else{
break;
}
array[j + 1] = tmp;
}
}
}
public static void main(String[] args) {
int[] array = {1,2,5,3,6,9,7};
insertSort(array);
System.out.println(Arrays.toString(array));
}
}
插入排序在最好情况下,需要比较n次,无需交换元素,时间复杂度为O(n),在最坏情况下,时间复杂度为O(n^2)。
但是在数组元素随机排列的情况下,插入排序还是优于选择排序和冒泡排序的。
稳定性: 稳定
3、选择排序
最简单、最直观的的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有的元素排完为止。
public class Test1{
public static void selectedSort(int[] array) { //选择排序
int tmp;
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++)
if (array[i] > array[i + 1]) {
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
public static void main(String[] args) {
int[] array = {1,2,5,3,6,9,7};
selectedSort(array);
System.out.println(Arrays.toString(array));
}
}
时间复杂度:O(n^2 )
稳定性: 不稳定
二维数组的拷贝
for()循环拷贝
class TestArray2 {
private int val;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return this.val;
}
}
public class TestDemo10211 {
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
int[][] brray = new int[2][3];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
brray[i][j] = array[i][j];
}
}
System.out.println(Arrays.deepToString(array));
System.out.println(Arrays.deepToString(brray));
brray[0][0] = 1000;
System.out.println("============修改完成=========");
System.out.println(Arrays.deepToString(array));
System.out.println(Arrays.deepToString(brray));
}
}
system.arraycopy()
class TestArray2 {
private int val;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return this.val;
}
}
public class TestDemo10211 {
public static void main(String[] args) {
TestArray2[][] testArray2 = new TestArray2[2][2];
testArray2[0][0] = new TestArray2();
testArray2[0][1] = new TestArray2();
testArray2[1][0] = new TestArray2();
testArray2[1][1] = new TestArray2();
TestArray2[][] testArray3 = new TestArray2[2][2];
for (int i = 0; i < testArray2.length; i++) {
for (int j = 0; j < testArray2[i].length; j++) {
testArray3[i][j] = testArray2[i][j];
}
}
System.out.println("=============拷贝完成=========");
for (int i = 0; i < testArray2.length; i++) {
for (int j = 0; j < testArray2[i].length; j++) {
System.out.print(testArray2[i][j].getVal()+" ");
}
}
System.out.println();
for (int i = 0; i < testArray3.length; i++) {
for (int j = 0; j < testArray3[i].length; j++) {
System.out.print(testArray3[i][j].getVal()+" ");
}
}
System.out.println();
testArray2[0][0].setVal(1000000);
System.out.println("============修改完成=========");
for (int i = 0; i < testArray2.length; i++) {
for (int j = 0; j < testArray2[i].length; j++) {
System.out.print(testArray2[i][j].getVal()+" ");
}
}
System.out.println();
for (int i = 0; i < testArray3.length; i++) {
for (int j = 0; j < testArray3[i].length; j++) {
System.out.print(testArray3[i][j].getVal()+" ");
}
}
System.out.println();
}
}
clone()
class TestArray2 {
private int val;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return this.val;
}
}
public class TestDemo10211 {
public static void main(String[] args) {
TestArray2[][] testArray2 = new TestArray2[2][2];
testArray2[0][0] = new TestArray2();
testArray2[0][1] = new TestArray2();
testArray2[1][0] = new TestArray2();
testArray2[1][1] = new TestArray2();
TestArray2[][] testArray3 = new TestArray2[2][2];
//clone
for (int i = 0; i <testArray2.length ; i++) {
testArray3[i] = testArray2[i].clone();
}
System.out.println("=============拷贝完成=========");
for (int i = 0; i < testArray2.length; i++) {
for (int j = 0; j < testArray2[i].length; j++) {
System.out.print(testArray2[i][j].getVal()+" ");
}
}
System.out.println();
for (int i = 0; i < testArray3.length; i++) {
for (int j = 0; j < testArray3[i].length; j++) {
System.out.print(testArray3[i][j].getVal()+" ");
}
}
System.out.println();
testArray2[0][0].setVal(1000000);
System.out.println("============修改完成=========");
for (int i = 0; i < testArray2.length; i++) {
for (int j = 0; j < testArray2[i].length; j++) {
System.out.print(testArray2[i][j].getVal()+" ");
}
}
System.out.println();
for (int i = 0; i < testArray3.length; i++) {
for (int j = 0; j < testArray3[i].length; j++) {
System.out.print(testArray3[i][j].getVal()+" ");
}
}
System.out.println();
}
}
Arrays.copyOf()
class TestArray2 {
private int val;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return this.val;
}
}
public class TestDemo10211 {
public static void main(String[] args) {
TestArray2[][] testArray2 = new TestArray2[2][2];
testArray2[0][0] = new TestArray2();
testArray2[0][1] = new TestArray2();
testArray2[1][0] = new TestArray2();
testArray2[1][1] = new TestArray2();
TestArray2[][] testArray3 = new TestArray2[2][2];
// System.arraycopy();
for (int i = 0; i < testArray2.length; i++) {
testArray3[i] = Arrays.copyOf(testArray2[i], testArray2[i].length);
System.arraycopy(testArray2[i], 0, testArray3[i], 0,
testArray2[i].length);
}
System.out.println(testArray3);
System.out.println(testArray2);
testArray3 = Arrays.copyOf(testArray2, testArray2.length);
System.out.println(testArray3);
System.out.println(testArray2);
System.out.println("=============拷贝完成=========");
for (int i = 0; i < testArray2.length; i++) {
for (int j = 0; j < testArray2[i].length; j++) {
System.out.print(testArray2[i][j].getVal() + " ");
}
}
System.out.println();
for (int i = 0; i < testArray3.length; i++) {
for (int j = 0; j < testArray3[i].length; j++) {
System.out.print(testArray3[i][j].getVal() + " ");
}
}
System.out.println();
testArray2[0][0].setVal(1000000);
System.out.println("============修改完成=========");
for (int i = 0; i < testArray2.length; i++) {
for (int j = 0; j < testArray2[i].length; j++) {
System.out.print(testArray2[i][j].getVal() + " ");
}
}
System.out.println();
for (int i = 0; i < testArray3.length; i++) {
for (int j = 0; j < testArray3[i].length; j++) {
System.out.print(testArray3[i][j].getVal() + " ");
}
}
System.out.println();
}
}