1 冒泡排序
1.1 思想
基本思想是对所有相邻记录的关键字值进行比效,如果是逆序,则将其交换,最终达到有序化;其处理过程为:
(1)将整个待排序的记录序列划分成有序区和无序区,初始状态有序区为空,无序区包括所有待排序的记录
(2)对无序区从前向后依次将相邻记录的关键字进行比较,若逆序将其交换,从而使得顺序记录向上”飘浮”(左移),逆序记录向下“堕落”(右移)。 每经过一趟冒泡排序,都使无序区中关键字值最大的记录进入有序区,对于由 n 个记录组成的记录序列,最多经过 n-1 趟冒泡排序,就可以将这 n 个记录重新按关键字顺序排列
##1.2 代码实现
public class BubblingSort {
public static void main(String[] args) {
BiblomgSortUnorderArray array = new BiblomgSortUnorderArray(10);
//插入数据
array.insert(11);
array.insert(2);
array.insert(33);
array.insert(41);
array.insert(1);
//显示数据
array.display();//11 2 33 41 1
//冒泡排序
array.bubling();
array.display();//1 2 11 33 41
}
}
class BiblomgSortUnorderArray{//无序数组类
private long[] array;//无序数组
private int nElement;//数组中存在的数据个数
//构造方法,初始化 arraySize 长度的无序数组,并初始化数据个数为 0
public BiblomgSortUnorderArray(int arraySize){
array = new long[arraySize];
nElement = 0;
}
//插入数据:直接在数组的末尾插入数据,数据个数加一
public void insert(long data){
array[nElement++] = data;
}
//寻找数据:遍历数组,返回查找到的数据的位置索引
public int get(long data){
for (int i = 0;i<nElement;i++){
if (data == array[i]){
return i;
}
}
return -1;//表示没有找到
}
//删除数据:先查找数据,再删除数据,再将后面的所有数据前移一个位置,最后数据个数减一
public void delete(long data){//只会删除找到的第一个目标数组
int index = get(data);
if (index==-1){
System.out.println("没有该数据");
}else {//找到数据索引后,直接将后面数据前移覆盖,不必再刻意删除
for (int i = index;i<nElement;i++){
array[i] = array[i+1];
}
nElement--;
}
}
//遍历数组:读取数组的每个数据项
public void display(){
for(int i = 0;i<nElement;i++){
System.out.print(array[i]+" ");
}
System.out.println();
}
//实现冒泡排序
public void bubling(){
int inner;
int outer;
for (outer = nElement-1;outer>0;outer--){//外层循环,从尾到头循环
for (inner=0;inner<outer;inner++){//内层循环,从头到 outer 循环
if (array[inner]>array[inner+1]){//如果发现前面元素比后面元素大,交换位置
long n = array[inner];
array[inner] = array[inner+1];
array[inner+1] = n;
}
}
}
}
}
2 选择排序
2.1 思想
如果有N个元素需要排序,那么首先从 N 个元素中找到最小的那个元素与第0位置上的元素交换,接着从剩余的 N-1 个元素中再次找到最小的那个元素和第1位置上的元素交换,依此循环
2.2 代码实现
public class SelectSort {
public static void main(String[] args) {
SelectSortUnorderArray array = new SelectSortUnorderArray(10);
//插入数据
array.insert(11);
array.insert(2);
array.insert(33);
array.insert(41);
array.insert(1);
//显示数据
array.display();//11 2 33 41 1
//选择排序
array.selectSort();
array.display();//1 2 11 33 41
}
}
class SelectSortUnorderArray {//无序数组类
private long[] array;//无序数组
private int nElement;//数组中存在的数据个数
//构造方法,初始化 arraySize 长度的无序数组,并初始化数据个数为 0
public SelectSortUnorderArray(int arraySize) {
array = new long[arraySize];
nElement = 0;
}
//插入数据:直接在数组的末尾插入数据,数据个数加一
public void insert(long data) {
array[nElement++] = data;
}
//寻找数据:遍历数组,返回查找到的数据的位置索引
public int get(long data) {
for (int i = 0; i < nElement; i++) {
if (data == array[i]) {
return i;
}
}
return -1;//表示没有找到
}
//删除数据:先查找数据,再删除数据,再将后面的所有数据前移一个位置,最后数据个数减一
public void delete(long data) {//只会删除找到的第一个目标数组
int index = get(data);
if (index == -1) {
System.out.println("没有该数据");
} else {//找到数据索引后,直接将后面数据前移覆盖,不必再刻意删除
for (int i = index; i < nElement; i++) {
array[i] = array[i + 1];
}
nElement--;
}
}
//遍历数组:读取数组的每个数据项
public void display() {
for (int i = 0; i < nElement; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
//实现选择排序
public void selectSort() {
int inner;//内边界
int outer;//外边界
int min;//最小值的索引
for(outer = 0;outer<nElement-1;outer++){//外层循环,outer从0遍历到倒数第二个元素
min = outer;//让 min 默认等于 outer
for (inner=outer+1;inner<nElement;inner++){//内层循环,inner 从 outer+1 遍历到最后一个元素
if(array[min]>array[inner]){//比较大小,将最小值位置索引赋值给 min
min = inner;
}
}
long n = array[outer];//将最小值与前面的大值进行交换
array[outer] = array[min];
array[min] = n;
}
}
}
3 插入排序
3.1 思想
对于一个无序列表,拿出一个临时变量(起始为第二个元素),将其和前面元素循环比较,如果前面的元素比临时变量大,就讲前面的元素向后移动一位,如果前面的元素比临时变量小,或者已经到达的头部第一个元素,就结束循环,然后在依此循环后面所有的元素
3.2 代码实现
public class InsertSort {
public static void main(String[] args) {
InsertSortUnorderArray array = new InsertSortUnorderArray(10);
//插入数据
array.insert(11);
array.insert(2);
array.insert(33);
array.insert(41);
array.insert(1);
//显示数据
array.display();//11 2 33 41 1
//插入排序
array.insertSort();
array.display();//1 2 11 33 41
}
}
class InsertSortUnorderArray {//无序数组类
private long[] array;//无序数组
private int nElement;//数组中存在的数据个数
//构造方法,初始化 arraySize 长度的无序数组,并初始化数据个数为 0
public InsertSortUnorderArray(int arraySize) {
array = new long[arraySize];
nElement = 0;
}
//插入数据:直接在数组的末尾插入数据,数据个数加一
public void insert(long data) {
array[nElement++] = data;
}
//寻找数据:遍历数组,返回查找到的数据的位置索引
public int get(long data) {
for (int i = 0; i < nElement; i++) {
if (data == array[i]) {
return i;
}
}
return -1;//表示没有找到
}
//删除数据:先查找数据,再删除数据,再将后面的所有数据前移一个位置,最后数据个数减一
public void delete(long data) {//只会删除找到的第一个目标数组
int index = get(data);
if (index == -1) {
System.out.println("没有该数据");
} else {//找到数据索引后,直接将后面数据前移覆盖,不必再刻意删除
for (int i = index; i < nElement; i++) {
array[i] = array[i + 1];
}
nElement--;
}
}
//遍历数组:读取数组的每个数据项
public void display() {
for (int i = 0; i < nElement; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
//实现插入排序
public void insertSort() {
int inner;//内边界
int outer;//外边界
int min;//最小值的索引
for (outer = 0; outer < nElement - 1; outer++) {//外层循环,outer从0遍历到倒数第二个元素
min = outer;//让 min 默认等于 outer
for (inner = outer + 1; inner < nElement; inner++) {//内层循环,inner 从 outer+1 遍历到最后一个元素
if (array[min] > array[inner]) {//比较大小,将最小值位置索引赋值给 min
min = inner;
}
}
long n = array[outer];//将最小值与前面的大值进行交换
array[outer] = array[min];
array[min] = n;
}
}
}