第四种数组排序方法:位置排序

今天分享一种新的数组排序方法:位置排序。

对于原始的数组排序,通常我们会想起三种排序方法:冒泡排序、选择排序和插入排序。

先说说这三种排序的原理:(以从小到大排序为例)

冒泡排序:两个相邻的元素比较,如果前一个大于后一个,换位置,依次类推。循环一次,获得一个最大值。

选择排序:从需要排序的范围内选出最小的元素的索引,与循环次数-1的索引对换。

插入排序:将后一个元素与前面所有有序的数组进行比较,找到位置,插入。

位置排序的原理为:

将每个元素与其他所有元素进行比较,找的应该排列的位置(索引),新建数组排列。

特点:需要新建一个数组;两重循环次数都为元素个数。

优点:将保存原数组。

缺点:新建的数组占内存。

看看各自的代码:

冒泡排序:
for(int i =0; i < arr.length; i++) {
int temp;
for(int j =0; j < arr.length <-i>-1; j++) {
if(arr[j] < arr[j+1]){
temp = arr[j];
arr[j] =arr[j +1];
arr[j+1] = temp
}
}
}

选择排序:
for(int i =0; i < arr.length; i++) {
int max =0;
for(int j =0; j < arr.length -i; j++) {
if(arr[j]>arr[max]) {
max =j;

}
int temp;
temp = arr[max];
arr[max] = arr[arr.length-i-1];
arr[arr.length-i-1] =temp;
}

插入排序:
for(int i =1; i < arr.length; i++) { 
for(int j =i; j > 0; j--){
if(arr[j] <arr[j-1]){
int temp;
temp = arr[j];
arr[j] = arr[j -1];
arr[j -1] = temp;
}
}
}

位置排序:
int[ ] arr1 = new int[arr.length];//新建一个相同大小的数组
for(int i = 0;  i < arr.length;  i++){
int num =0;
for(int j =0; j < arr.length; j++){
if(arr[i]  >  arr[j]){
num++; //找到元素应该排列的位置(索引) 
}
}
arr1[num] = arr[i];//将元素放置在新数组相应位置。

arr = arr1;//可以赋值给原数组,遗忘新建数组


四种排序的共同点:都有两重循环。

总结:

冒泡排序关键词:标准 ;非下标; 一个变量; 二次循环排序;

特点:一次循环次数为元素个数;二次循环次数为元素个数减1(对比方式减1)再减一次循环的循环次数,顺序和倒序只需修改对比的大小符号。

选择排序关键词:下标;两个变量;一次循环排序(不在二次循环内部交换值);

特点:一次循环次数为元素个数(或减一);二次循环次数为元素个数减一次循环的循环次数,顺序和倒序只需要更改大小符号。

插入排序关键词:倒叙;  二次循环排序;

特点:一次循环次数为元素个数减一,从第二个元素开始对比;二次循环次数为一次循环的元素位置前的个数,并从后向前循环。

位置排序关键词:空数组;  一次循环排序;

特点:两次循环次数都为元素个数。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值