8、15
排序算法
//一、冒泡排序
//冒泡排序涉及到双循环,外层循环控制趟数,内层循环控制比较次数
//小的上去 大的下来
//20 90 13 88 4 15 40
//20 13 88 4 15 40 90 第一趟
//13 20 4 15 40 88 第二趟
//13 4 15 20 第三趟
//4 13 15 第四趟
//4 13 第五趟
// int [] intArr = {20,90,13,88,1,15,40};
// for (int i = 0; i < intArr.Length - 1; i++) {
// for (int j = 0; j < intArr.Length - 1 - i; ++j) {
// if (intArr [j] > intArr [j + 1]) {//第一个和第二个比 如果第二个大于第一个走下面 不成立不用管结束本次循环 重头循环
// int temp = intArr [i];//temp是一个临时用来交换的值
// intArr [j] = intArr [j + 1];
// intArr [j + 1] = temp;
// }
// }
// }
// 交换方法
// int a =3 ,b=4;
// int temp = a;
// a = b;
// b = temp;
//
// a = a + b;
// b = a - b;
// a = a - b;
//选择排序 从剩余数组里面选出最小或最大的数 与第一个数交换
int [] intArr = {20,90,13,88,1,15,40};
int min ;//定义一个最小的数
int minIndex ;//定义一个最小的数的下标
for (int i = 0; i < intArr.Length-1; i++) {//-1 是为了省略最后一趟比较,前面的比较已经确保最后一位最小
min = intArr [i];//第一趟进来时正好是第 0 个; 可以换成 min = int.Maxvule 后面 j =i
minIndex = i;//记录一下最小值下标
//找出剩余数组中的最小值
for (int j = i +1; j < intArr.Length; j++) {//i + 1是为了直接与下一个值比较
//length 没有-1 因为每一次都比到最后一个
//如果用min = min >intArr[j]? intArr[j]:min;找最小值 但不能记录下标
if (min > intArr [j]) {
min = intArr [j];
minIndex = j;//记录下标
}
}
intArr [minIndex] = intArr [i];
intArr [i] = min;
}
for (int i = 0; i < intArr.Length; ++i) {
Console.Write (intArr[i]+" ");
}
插入排序
在一个有序数组中插入(先把第一个数作为有序数组),升序排序,从后往前比较,后一个如果比前一个小就放到前面有序数组中。
每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
待排数据与前面数据比较,如果比前面一个数大则不用管,小的话继续往前面放
插入排序
// 选择第一个有序数a {0 }
int[] intArr ={20,90,13,88,1,15,40};
int temp;
int index;//记录需要比较(前面有序数组)的数的下标
for(int i = 1;i < intArr .Length;i++){// 往前比 i 不用等于 0
temp = intArr[i];// temp = 第 i 个
index = i -1; // index是 后一个数的下标
while (index >= 0 && temp < intArr [index]) {//13<90 13 < 90
//后移操作
//后一个比前一个小的话 往前移 放到合适的位置
// [index + 1]是因为比到第一位的时候 index = -1;
intArr [index + 1] = intArr [index];
--index; //-p为了把它放到大小合适的位置上
}
intArr [index + 1] = temp;//放到 第一个位置上
}
for (int i = 0; i < intArr.Length; ++i) {
Console.Write (intArr[i]+" ");
}