星期排序 java_java 排序

1.归并排序

把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。

可从上到下或从下到上进行。

过程演示:

7f09a287e7a87f7454fcd686fb88d872.png

一、迭代法

1.待排序数据为data

2.每轮排序的结果保存为result(辅助空间)

3.每轮排序的结果result需要重新复制给data

4.最后排序结束的时候,data与result一模一样,都是排序好的结果

public static voidmain(String[] args) {//TODO Auto-generated method stub

ArrayList data = new ArrayList<>();

Random random= new Random(42);for (int i = 0; i < 10; i++) {

data.add((int)(random.nextInt(100)));

}

Iterator iterator =data.iterator();while(iterator.hasNext()){

System.out.println(iterator.next());

}

System.out.println();

ArrayList result = new ArrayList<>();

result.addAll(data);for (int seg = 1; seg < data.size(); seg=2*seg) {for (int start = 0; start < data.size(); start=start+2*seg) {intstart1,end1,start2,end2;int mid = Math.min(start+seg,data.size());int end = Math.min(start+2*seg,data.size());

start1= start; end1=mid; start2=mid; end2 =end;int k=start,idx;while(start1

if (data.get(start1)

result.set(k++,data.get(start1++));elseresult.set(k++,data.get(start2++));

}while(start1

result.set(k++,data.get(start1++));

}while(start2

result.set(k++,data.get(start2++));

}

}

data.clear();

data.addAll(result);

}for (Iterator iterator2 =result.iterator(); iterator2.hasNext();) {

Integer integer=(Integer) iterator2.next();

System.out.println(integer);

}

}

264d3bfc9b46bd6c2abf5f14127b0c83.png

递归法public static voidmain(String[] args) {int[] data=new int[10];

Random random= new Random(42);for (int i = 0; i < data.length; i++) {

data[i]=((int)(random.nextInt(100)));

}int[] auxiliary_arr = new int[data.length];

merge_sort_recursive(data, auxiliary_arr,0, data.length-1);for (int i = 0; i < auxiliary_arr.length; i++) {

System.out.println(data[i]+"\t"+auxiliary_arr[i]);

}

}public static void merge_sort_recursive(int[] data, int[] auxiliary_arr, int startIdx, intendIdx){//System.out.println(startIdx+"\t\t"+endIdx);

if(startIdx>=endIdx)return;int len = endIdx-startIdx;

int start1 =startIdx;int end1 = (len>>1) +start1;int start2=end1+1;int end2 =endIdx;

merge_sort_recursive(data, auxiliary_arr, start1, end1);

merge_sort_recursive(data, auxiliary_arr, start2, end2);int k =startIdx;while(start1<=end1 && start2<=end2){

auxiliary_arr[k++] = data[start1]

}while(start1<=end1)

auxiliary_arr[k++]=data[start1++];while(start2<=end2)

auxiliary_arr[k++]=data[start2++];//todo 把auxiliary数组startIdx到endIdx部分的数据复制给data

for (int i = startIdx; i <= endIdx; i++) {

data[i]=auxiliary_arr[i];

}

}

2. 冒泡排序

冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。

public static voidmain(String[] args) {int[] data=new int[10];

Random random= new Random(42);for (int i = 0; i < data.length; i++) {

data[i]=((int)(random.nextInt(100)));

}

bubble_sort(data);for (int i = 0; i < data.length; i++) {

System.out.println(data[i]);

}

}public static void bubble_sort(int[] data){for (int i = 0; i < data.length - 1; i++) {for (int j = 0; j < data.length -1 -i; j++) {inttemp;if (data[j]>data[j+1]){

temp=data[j];

data[j]=data[j+1];

data[j+1]=temp;

}

}

}

}

3.选择排序

a.每一次把最小值放在后面

public static voidmain(String[] args) {int[] data=new int[10];

Random random= new Random(42);for (int i = 0; i < data.length; i++) {

data[i]=((int)(random.nextInt(100)));

}for (int i = 0; i < data.length; i++) {

System.out.print(data[i]+"\t");

}

System.out.println("\n开始排序");

select_sort(data);

System.out.println("\n排序结果");for (int i = 0; i < data.length; i++) {

System.out.print(data[i]+"\t");

}

}public static void select_sort(int[] data){//每一轮把最小值放在后面

intmin;for (int i = 0; i < data.length-1 ; i++) {int idx=0;

min=data[idx];for (int j = 1; j < data.length-i; j++) {if (data[j]

idx=j;

min=data[idx];

}

}inttemp;

temp=data[idx];

data[idx]= data[data.length-1-i];

data[data.length-1-i] =temp;for (int d = 0; d < data.length; d++) {

System.out.print(data[d]+"\t");

}

System.out.println();

}

}

b.每次把最小值放在前面

过程演示如下:

53b82b6d1be7592d7e63015013b11dbb.png

public static void select_sort(int[] data){//每次把最小值放在前面

intmin;for (int i = 0; i < data.length-1 ; i++) {int idx=i; //idx = i

min=data[idx];for (int j = i+1; j < data.length; j++) {if (data[j]

idx=j;

min=data[idx];

}

}inttemp;

temp=data[idx];

data[idx]=data[i];

data[i]=temp;for (int d = 0; d < data.length; d++) {

System.out.print(data[d]+"\t");

}

System.out.println();

}

}

4.插入排序

a.简单插入排序

// 通过ArrayList实现

public static voidmain(String[] args) {

Random random= new Random(42);

ArrayList data = new ArrayList<>();for (int i = 0; i < 10; i++) {

data1.add(((int)(random.nextInt(100))););

}for (int i = 0; i < data.size(); i++) {

System.out.print(data1.get(i)+"\t");

}

System.out.println("\n开始排序");

ArrayList result =insert_sort(data1);

System.out.println("\n排序结果");for (int i = 0; i < result.size(); i++) {

System.out.print(result.get(i)+"\t");

}

}public static ArrayList insert_sort(ArrayListdata){

ArrayList result = new ArrayList<>();

result.add(data.get(0));for (int i = 1; i < data.size(); i++) {//todo data[i]与result中的元素作比较,得到插入的位置,可以用二分查找

int insertIdx=result.size();

方式一:二分查找int low=0,high=result.size()-1;while(low<=high){int mid=(low+high)/2;//todo 怎样找到空位,

if (data.get(i)

high=mid-1;

insertIdx=mid;

}else{

low=mid+1;

}

}//方式二:逆序依次查找//for (int j = result.size()-1 ; j>=0; j--) {//if(data.get(i)//

result.add(insertIdx, data.get(i));

}returnresult;

}

//通过数组实现,多了移动数组元素的操作

public static voidmain(String[] args) {int[] data=new int[30];

Random random= new Random(42);for (int i = 0; i < data.length; i++) {

data[i]=((int)(random.nextInt(100)));

}for (int i = 0; i < data.length; i++) {

System.out.print(data[i]+"\t");

}

System.out.println();

insert_sort_2(data);for (int i = 0; i < data.length; i++) {

System.out.print(data[i]+"\t");

}

}public static void insert_sort_2(int[] data){int temp;//记录当前需要插入的元素的值,因为需要把此元素之前所有大于此元素的值,进行后移。

intj;//for (int i = 1; i < data.length;i++ ) {//temp= data[i];//for (j=i-1; j >=0;j-- ) { // j=i-1,j>=0,data[j+1]=data[j],data[j+1]=temp; 或者j=i,j>0,data[j]=data[j-1],data[j]=temp;

//if(data[j]>temp){//把这个条件放在循环时候判定,就不用continue break这么麻烦//data[j+1] = data[j];//continue;//}//break;//}//data[j+1] = temp;//}

for (int i = 1; i < data.length;i++) {

temp=data[i];for (j=i-1; j >=0&&data[j]>temp;j--) {

data[j+1] =data[j];

}

data[j+1] =temp;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值