八大排序代码

本文详细介绍了八大排序算法:冒泡排序、插入排序、快速排序、简单选择排序、堆排序、归并排序、希尔排序和基数排序。通过示例代码展示了每种排序算法的工作原理和实现过程,帮助读者深入理解各种排序算法的优缺点和适用场景。
摘要由CSDN通过智能技术生成

1,冒泡排序

for(int i=0;i<arr.length-1;i++){
    for(int j=0;j<arr.length-1-i;j++)
    {
        if(arr[j+1]<arr[j])
        {
            int t=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=t;
        }
    }

2,插入排序

public static void insertsort(int[] arr) {
		 for(int i=1;i<arr.length;i++) {
			 for(int j=0;j<i;j++){
				 if(arr[j]>arr[i]) {
					 int k = arr[i];
					 for(int c =i-1;c>=j;c--) {
						 arr[c+1]=arr[c];
					 }
					 arr[j] = k;
				 }
			 }
		 }
	 }

3,快速排序

	public  static void kp(int arr[],int left,int right) {
		if(left >= right) {
			return;
		}
	int i = left;
	int j = right;
	int base = arr[left];
	
	while(i!= j) {
		while(arr[j]>=base && i<j) {
			j--;
		}
		while(arr[i]<=base && i<j) {
			i++;
		}
		//i和j的值进行交换
		int t = arr[i];
		arr[i] = arr[j];
		arr[j] = t;
		
	}
	
	arr[left] = arr[i];
	arr[i] = base;
	
	kp(arr,left,i-1);
	kp(arr,i+1,right);
}

4,简单选择排序

public static void search(int[] arr) {
		for(int i=0;i<arr.length;i++) {
			int min = arr[i];
			for(int j=i+1;j<arr.length;j++) {
				if(min>arr[j]) {
					int t = min;
					min = arr[j];
					arr[j] = t;
				}
			}
			if(min != arr[i]) {
				int temp = min;
				min = arr[i];
				arr[i] = temp;
			}
		}
	}

5,堆排序

public class duipai {
	public static void main(String[] args) {
		int[] arr = {16, 7, 3, 20, 17, 8};
		headSoet(arr);
		System.out.println(Arrays.toString(arr));
		
	}
	//创建堆
	public static void headSoet(int[] arr) {
		for(int i=(arr.length-1)/2;i>=0;i--) {
			HeadSort(arr, i, arr.length);
		}
		
		//调整堆结构+让堆顶元素和堆尾元素进行交换
		for(int i=arr.length-1;i>0;i--) {
			int temp = arr[i];
			arr[i]=arr[0];
			arr[0]=temp;
			HeadSort(arr,0,i);
		}
	}
	
	//调整大顶锥的方法
	public static void HeadSort(int[] arr,int parent,int length) {
		int temp = arr[parent]; //定义父节点的值
		int lchild = 2*parent+1; //如果当前节点不是叶子节点,一定有左子树
		while(lchild < length) {
			int rchild = lchild + 1; //右孩子
			if(rchild < length && arr[lchild] < arr[rchild]) {
				lchild ++;
			}
			//判断父节点的值和左指针的值
			if(temp >= arr[lchild]) {
				break;
			}
			arr[parent] = arr[lchild];
			parent = lchild;
			lchild = lchild *2+1;
		}
		arr[parent] = temp;
		
	}

}

6,归并排序

public static void sort(int[] arr,int left,int right) {
		if(left>=right) {
			return;
		}
		 if (left<right) {   // 说明至少还存在两个元素:需要进行分
			 int mid = (left+ right) / 2;       // 获得中间位置的下标(偏左)
			 sort(arr, left, mid);          // 分操作:对左半部分的子序列递归调用
			 sort(arr, mid+1, right);   // 分操作:对右半部分的子序列递归调用
		     // 治操作:解决有序两个子序列的合并
			 merge(arr, left, mid, right);
		}
	}
	public static void merge(int[] arr,int left,int mid,int right) {
		int s1 = left;
		int s2 = mid+1;
		int[] temp = new int[right-left+1];
		int index =0;
		while(s1<=mid && s2<=right) {
			if(arr[s1]<=arr[s2]) {
				temp[index]=arr[s1];
				index++;
				s1++;
			}else {
				temp[index]=arr[s2];
				index++;
				s2++;
			}
		}
	while(s1<=mid) {
		temp[index]=arr[s1];
		index++;
		s1++;
	}
	while(s2<=right) {
		temp[index]=arr[s2];
		index++;
		s2++;
	}
	for(int j=0;j<temp.length;j++) {
		arr[j+left]=temp[j];
	}
}

7,希尔排序

public static void sort(int[] arr) {
		for(int gap = arr.length/2;gap>0;gap/=2) {
		//第一轮,将10个数组分成两轮
		for(int i=gap;i<arr.length;i++) {
			for(int j=i-gap;j>=0;j-=gap) {
				if(arr[j]>arr[j+gap]) {
					int temp = arr[j];
					arr[j] = arr[j+gap];
					arr[j+gap] = temp;
				}
			}
		}
		}

}		

8,基数排序

public static void sort(int[] arr) {
		//找到最大数值
		int max = arr[0];
		for(int i=0;i<arr.length;i++) {
			if(arr[i]>max) {
				max = arr[i];
			}
		}
		//找到最大值是几位数
		int maxlength = (max + "").length();
		//定义二维数组表示桶
		int[][] bucket = new int[10][arr.length];
		int counts[] = new int[10];
		//针对每一位
		int n=1;
		 for (int h = 0;h<maxlength;h++){
	            for (int i= 0;i<arr.length;i++){
	                //取出每一个元素个位的值
	                int element = arr[i] / n % 10;
	                //放入到对应的桶当中
	                bucket[element][counts[element]] = arr[i];
	                counts[element]++;
	            }
	            int index =0; //index的目的是遍历元数组
	            // 将桶内的数据倒出来
	            for (int k = 0;k<10;k++){
	                //如果我们的桶当中有数据我们就将数据放入到原数组当中去
	                if(counts[k] !=0){
	                    //便利桶,将桶内的数据放入到原数组
	                    for (int j = 0;j<counts[k];j++){
	                        arr[index ++] = bucket[k][j];
	                    }
	                }
	                //处理完数组之后,将tempCounts置空
	                counts[k] = 0;
	            }
	            n = n *10;
	        }
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值