(更新中)经典八大排序Python和java实现

插入排序

(1)直接插入排序
python实现
def InsertSort(list1):
    for i in range(1,len(list1)):
        temp = list1[i]
        j = i-1
        while j>=0 and list1[j]>temp:
            list1[j+1] = list1[j]
            list1[j] = temp
            j-=1
        else:
            list1[j+1] = temp
    return list1

list1 = [2,5,1,4,7,3,0,8,9]
print(InsertSort(list1))
java实现
import java.util.Arrays;
public class Sort {
    public static void main(String []args) {
		int[] arr = new int[]{49,38,65,97,76,13,27,49,55,4};
		InsertSort(arr);
        System.out.println(Arrays.toString(arr));
    }
	
	public static void InsertSort(int[] arr){
		for(int i = 1,len = arr.length;i<len;i++){
			if (arr[i]<arr[i-1]){
				int temp = arr[i];
				int j;
				for (j=i-1;j>=0 && arr[j]>temp;j--){
					arr[j+1] = arr[j];
				}
			arr[j+1] = temp;
			}
		}
	}	
}
(2)折半插入排序
python实现
#折半插入排序
def HalfSort(list1):
    for i in range(1,len(list1)):
        if list1[i]<list1[i-1]:
            low,high,temp = 0,i-1,list[i]
            while low<=high:#找到位置
                mid = (high+low)/2
                if list1[mid] > temp:
                    high = mid-1
                else:
                    low = mid + 1
            j = i-1
            while j >= low:#移位
                list1[j+1] = list1[j]
                j-=1
            list1[low] = temp#放入位置
        # print(list1)#可以查看逻辑,尽管和插入排序结果一样,但是内部实现是不同的
    return list1

list1 = [2,5,1,4,7,3,0,8,9]
print(HalfSort(list1))
java实现
import java.util.Arrays;
public class Sort {
    public static void main(String []args) {
		int[] arr = new int[]{49,38,65,97,76,13,27,49,55,4};
		HalfSort(arr);
        System.out.println(Arrays.toString(arr));
    }
	
	public static void HalfSort(int[] arr){
		int n = arr.length;
		for(int i = 1;i<n;i++){
			if(arr[i]<arr[i-1]){
				int temp = arr[i];
				int low = 0;
				int high = i-1;
				while(low <= high){
					int mid = (low+high)/2;
					if (arr[mid]>temp){
						high = mid-1;
					}else{
						low = mid+1;
					}
				}
				//移位
				for(int j = i-1;j>=low;j--){
					arr[j+1] = arr[j];
				}
				arr[low] = temp; 
			}
		}  	
	}	
}
(3)希尔排序
python实现
# 希尔排序
def ShellSort(list1):
    length = len(list1)
    step = int(length / 2)
    while step>=1:
        i = step
        while i <length:
            if list1[i] < list1[i-step]:
                temp = list1[i]
                j = i-step
                while (list1[j] > temp and j >= 0):#移位
                    list1[j+step] = list1[j]
                    j-=step
                list1[j+step] = temp#放进位置
            i+=1
        step=int(step/2)
        print(list1)
    return list1

list1 = [2,5,1,4,7,3,0,8,9]
list1 = [49,38,65,97,76,13,27,49,55,4]
print(ShellSort(list1))
java实现
希尔排序
import java.util.Arrays;
public class Sort {
	public static void main(String[] args) {
		int[] array =new int[]{2,5,1,4,7,3,0,8,9};
	    int n = array.length;
		for(int step = n/2;step>0;step/=2){
			for(int i=step;i<n;i++){	
				for(int j = i-step;j>=0 ;j-=step){  
					if (array[j]>array[j+step]){
						int temp = array[j+step];
					    array[j+step] = array[j];
						array[j] = temp;
	                 }
				}	
			}
		} 
		System.out.println(Arrays.toString(array));
	}		
}
或者如下改进,减少交换次数
import java.util.Arrays;
public class HelloWorld {
	public static void main(String[] args) {
		int[] array =new int[]{49,38,65,97,76,13,27,49,55,04};
	    int n = array.length;
		for(int step = n/2;step>0;step/=2){
			for(int i=step;i<n;i++){
				if (array[i]<array[i-step]){
					int temp = array[i];
					int j;
					for(j = i-step;j>=0&&array[j]>temp;j-=step){ 		
						array[j+step] = array[j];
                    }
					array[j+step] = temp;		
				}
			}
			System.out.println(Arrays.toString(array));
		}  
	}		
}

比较排序(交换排序)

(1)冒泡排序
Python实现
#未改进的冒泡排序
def BubbleSort(list1):
	length = len(list1)
	for i in range(length):
	    for j in range(1,length-i):
	        if list1[j] < list1[j-1]:
	            temp = list1[j]
	            list1[j] = list1[j-1]
	            list1[j-1] = temp
	    print(list1)
	return list1

list1 = [49,38,65,97,76,13,27,49,55,4]
print(BubbleSort(list1))
改进的冒泡排序Python(只要某一趟没有发生数据交换意味着排序结束,无需再空跑)
#改进的冒泡排序
def BubbleSort(list1):
    length = len(list1)
    for i in range(length):
        flag = False
        for j in range(1,length-i):
            if list1[j] < list1[j-1]:
                temp = list1[j]
                list1[j] = list1[j-1]
                list1[j-1] = temp
                flag = True
        if flag == False:
            break
        print(list1)
    return list1

list1 = [49,38,65,97,76,13,27,49,55,4]
print(BubbleSort(list1))
或者使用while循环
#使用while循环的冒泡排序
def BubbleSort(list1):
    length = len(list1)
    flag = True
    while flag:
        flag = False
        for j in range(1,length):
            if list1[j] < list1[j-1]:
                temp = list1[j]
                list1[j] = list1[j-1]
                list1[j-1] = temp
                flag = True
        print(list1)
        length -= 1
    return list1

list1 = [49,38,65,97,76,13,27,49,55,4]
print(BubbleSort(list1))
java实现(未改进)
//冒泡排序(未改进)
import java.util.Arrays;
public class Sort {
	public static void main(String[] args) {
		int[] array =new int[]{49,38,65,97,76,13,27,49,55,04};
	    int n = array.length;
		for(int i = 0;i<n;i++){
			for(int j=1;j<n-i;j++){
				if (array[j]<array[j-1]){
					int temp = array[j];
					array[j] = array[j-1];
					array[j-1] = temp;		
				}
			}
		System.out.println(Arrays.toString(array));
		}  
	}	
}
java实现(改进)
//冒泡排序(改进)
import java.util.Arrays;
public class HelloWorld {
	public static void main(String[] args) {
		int[] array =new int[]{49,38,65,97,76,13,27,49,55,04};
	    int n = array.length;
		for(int i = 0;i<n;i++){
			boolean flag = false;
			for(int j=1;j<n-i;j++){
				if (array[j]<array[j-1]){
					int temp = array[j];
					array[j] = array[j-1];
					array[j-1] = temp;
					flag = true;
				}
			}
			if (!flag){
				break;
			}
		System.out.println(Arrays.toString(array));
		}  
	}	
}
或者while循环
import java.util.Arrays;
public class Sort {
	public static void main(String[] args) {
		int[] array =new int[]{49,38,65,97,76,13,27,49,55,04};
	    int len = array.length;
	    boolean flag = true;
	    while (flag) {
	        flag = false;
	        for (int i = 0; i < len - 1; i++) {
	            if (array[i] > array[i + 1]) {
	                int temp = array[i + 1];
	                array[i + 1] = array[j];
	                array[i] = temp;
	                flag = true;
	            }
	        }
	        len--;
	        System.out.println(Arrays.toString(array));
	    }
    }
}
(2)快速排序(默认第一个元素是枢轴值)
Python实现
#快速排序,默认第一个元素是枢轴值
def QuickSort(list1,low,high):
    if low < high:
        pivot = Separate(list1,low,high)
        QuickSort(list1,low,pivot-1)
        QuickSort(list1,pivot+1,high)
    return list1

def Separate(list1,low,high):
    pivot = list1[low]
    while low<high:
        while low < high and list1[high]>= pivot:
            high-=1
        list1[low] = list1[high]
        while low < high and list1[low]<pivot:
            low+=1
        list1[high] = list1[low]
    list1[low] = pivot
    return low

list1 = [49,38,65,97,76,13,27,49,55,4]
length = len(list1)
result = QuickSort(list1,0,length-1)
print(list1)
java实现
//快速排序
import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        QuickSort(new int[]{39,28,55,87,66,3,17,39});
    }

    public static void QuickSort(int[] arr){
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void quickSort(int[] arr,int left,int right){
        int middle;
        if(left < right){
            middle = partition(arr,left,right);
            quickSort(arr,left,middle-1);
            quickSort(arr,middle+1,right);
        }
    }

    public static int partition(int[] arr,int left,int right){
        int pivot = arr[left];
        while(left < right){
            while(left<right && arr[right] >= pivot)
                right--;
            arr[left] = arr[right];
            while(left < right && arr[left]<= pivot)
                left++;
            arr[right] = arr[left];
        }
        arr[left] = pivot;
        return left;
    }
}

3选择排序

(1)简单选择排序
Python实现
def SelectSort(list1):
    n = len(list1)
    for i in range(0,n-1):#注意这里是n-1,因为最后一个数一定是最大的,所以可以少比一趟
        min = i#存储下标
        for j in range(i+1,n):
            if list1[j] < list1[min]:
                min = j
        if min!=i:
            temp = list1[i]
            list1[i] = list1[min]
            list1[min] = temp
        print(list1)
    return list1

list1 = [49,38,65,97,76,13,27,49,55,4]
print(SelectSort(list1))
java实现
import java.util.Arrays;
public class Sort {
    public static void main(String []args) {
		int[] arr = new int[]{49,38,65,97,76,13,27,49,55,4};
		selectSort(arr);
        System.out.println(Arrays.toString(arr));
    }
	
	public static void selectSort(int[] array) {
	    int n = array.length;
	    for (int i = 0; i < n; i++) {
	        int minIndex = i;
	        for (int j = i + 1; j < n; j++) {
	            if (array[minIndex] > array[j]) {
	                minIndex = j;
	            }
	        }
	        if (i != minIndex) {
	            int temp = array[i];
	            array[i] = array[minIndex];
	            array[minIndex] = temp;
	        }
	    }
	}
}
(2)堆排序大顶堆(大根堆)
Python实现(尽管有相应的第三方库,为了更好的了解这种二叉树数据结构,还是自己写一个吧)
#堆排序
def Heap_Sort(arr):
    n = len(arr)
    max_index = n-1
    i = int((max_index-1)/2)
    while i>=0:
        AdjustHeap(arr,n,i)
        i-=1
    j = n-1
    while j>0:
        arr[0],arr[j] = arr[j],arr[0]
        AdjustHeap(arr,j,0)
        j-=1
    return arr

def AdjustHeap(arr,n,i):#创建堆,调整堆
    leftchild = 2*i+1
    rightchild = 2*i+2
    largest_index = i
    if (leftchild<n and arr[leftchild]>arr[largest_index]):
        largest_index = leftchild
    if (rightchild<n and arr[rightchild]>arr[largest_index]):
        largest_index = rightchild
    if largest_index!=i:
        arr[i],arr[largest_index] = arr[largest_index],arr[i]
        AdjustHeap(arr,n,largest_index)

list1 = [49,38,65,97,76,13,27,49,55,4]
print(Heap_Sort(list1))
java实现
//堆排序
import java.util.Arrays;
public class HelloWorld {
    public static void main(String []args) {
		int[] arr = new int[]{49,38,65,97,76,13,27,49,55,4};
		heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }
	
	public static void heapSort(int[] array) {
		// 1. 创建最大堆:从最后一个节点的父节点开始
		int lastIndex = array.length - 1;
		int startIndex = (lastIndex - 1) / 2;
		for (int i = startIndex; i >= 0; i--) {
			maxHeap(array, array.length, i);
		}
		// 2. 排序:末尾与头交换,逐一找出最大值,最终形成一个递增的有序序列
		for (int i = array.length - 1; i > 0; i--) {
			int temp = array[0];
			array[0] = array[i];
			array[i] = temp;
			maxHeap(array, i, 0);
		}
	}
 
	private static void maxHeap(int[] data, int heapSize, int index) {
		// 左子节点
		int leftChild = 2 * index + 1;
		// 右子节点
		int rightChild = 2 * index + 2;
		// 最大元素下标
		int largestIndex = index;
		// 分别比较当前节点和左右子节点,找出最大值
		if (leftChild < heapSize && data[leftChild] > data[largestIndex]) {
			largestIndex = leftChild;
		}
		if (rightChild < heapSize && data[rightChild] > data[largestIndex]) {
			largestIndex = rightChild;
		}
		// 如果最大值是子节点,则进行交换
		if (largestIndex != index) {
			int temp = data[index];
			data[index] = data[largestIndex];
			data[largestIndex] = temp;
			// 交换后,其子节点可能就不是最大堆了,需要对交换的子节点重新调整
			maxHeap(data, heapSize, largestIndex);
		}
	}
}
(3)二路归并排序
Python实现
#二路归并排序
def MergeSort(arr,low,high):
    mid = int((high + low) / 2)
    if (low<high):
        MergeSort(arr,low,mid)
        MergeSort(arr,mid+1,high)
        Merge(arr,low,mid,high)
    return arr

def Merge(arr,low,mid,high):
    temp = [0]*(high-low+1)
    i,j,k = low,mid+1,0
    while(i<=mid and j<=high):
        if arr[i]<arr[j]:
            temp[k] = arr[i]
            i+=1
        else:
            temp[k] = arr[j]
            j+=1
        k+=1
    #如果两个表长度不一样,剩余的有序部分全部复制到temp表
    while(i<=mid):
        temp[k] = arr[i]
        k = k+1
        i = i+1
    while(j<=high):
        temp[k] = arr[j]
        j+=1
        k+=1
    #将排好序的temp表数据替换到原来的表中
    for m in range(len(temp)):
        arr[m+low] = temp[m]

list1 = [49,38,65,97,76,13,27,49,55,4]
length = len(list1)
print(MergeSort(list1,0,length-1))
java实现
二路归并排序
import java.util.Arrays;
public class HelloWorld {
    public static void main(String []args) {
		int[] arr = new int[]{49,38,65,97,76,13,27,49,55,4};
		mergeSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
	
	public static void mergeSort(int[] array, int low, int high) {
		int middle = (low + high) / 2;
		if (low < high) {
			mergeSort(array, low, middle);
			mergeSort(array, middle + 1, high);
			merge(array, low, middle, high);
		}
	}
 
	public static void merge(int[] array, int low, int middle, int high) {
		int[] temp = new int[high - low + 1];
		int i = low;
		int j = middle + 1;
		int k = 0;
		while (i <= middle && j <= high) {
			if (array[i] < array[j]) {
				temp[k++] = array[i++];
			} else {
				temp[k++] = array[j++];
			}
		}
		while (i <= middle) {
			temp[k++] = array[i++];
		}
		while (j <= high) {
			temp[k++] = array[j++];
		}
		for (int m = 0; m < temp.length; m++) {
			array[m + low] = temp[m];
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值