基本排序(选择排序、直接插入排序、冒泡排序、快速排序)

本文详细介绍了四种常见的排序算法:选择排序、直接插入排序、冒泡排序和快速排序。每种算法都包括其工作原理及实现代码,帮助读者理解并掌握这些算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

选择排序

原理:对于n个数,进行n-1次排序,每次扫描,找出最大(最小)放到数列的指定位置。

代码:

void select_sort(int arr[]){  
	     int max,index;  //最大值及其下标  
	     for (int i=0; i<arr.length-1; i++){  
	         max = arr[i];               //每次遍历前max 和 index的设置  
	         index = i;  
	         for (int j=i+1; j<arr.length; j++){  
	             if (arr[j] > max){  
	                 max = arr[j];  
	                 index = j;  
	             }  
	         }  
	         arr[index] = arr[i];  
	         arr[i] = max;  
	     }  
} 

直接插入排序

原理:对于n个数,进行n-1次排序,每一次将一个待排序的第一个数按其大小插入到前面已排好序的数组的适当位置,直到对象全部插入为止。

代码:

第一种(未排序的数组第一个数加入已排好序的数组尾部组成一个临时数组,然后从临时数组尾部开始比较相邻数字,如果前面数字大于后面数字就交换位置,直到临时数组都比较)(优先选择)。

public static void insert_sort(int[] number) {
	int n = number.length;
	int temp;
	for(int i = 1; i< n; i++) {
	   for(int j = i; j>0 && number[j-1] > number[j]; j--) {
	       temp = number[j];
	       number[j] = number[j-1];
	       number[j-1] = temp;
	    }
	 }
}

第二种(记录未排序的数组第一个数应插入的位置index, 然后数组从index向后移动一位直到刚刚未排序的第一个数的位置(不包含这位))

public static void insert_sort(int[] number) {
	 	int index;
	 	int temp;
        for(int i = 1; i< number.length; i++) {
        	index=i;
        	for(int j=0; j<i;j++){
        		if(number[i]<number[j]){
        			index=j;
        			break;
        		}
        	}
        	if(index != i){
        		temp=number[i];
        		for(int k=i;k>index;k--){
        			number[k]=number[k-1];
        		}
        		number[index] = temp;
        	}
        }
 }

冒泡排序

原理:对于n个数,进行n-1次排序,每次扫描通过相邻两个数的比较,找出最大(最小)放到数列的顶部(尾部)。

代码:

void bubble_sort(int[] arr){
	int temp;
	for(int i=1;i<arr.length;i++){  
	    for(int j = 0; j<arr.length-i;j++){ //从头向尾扫描,把最大(最小)的放到尾部
		if(arr[j]>arr[j+1]){  //‘>’把最大的放到顶部(尾部)、‘<’把最小的放到顶部(尾部)
		    temp = arr[j];
		    arr[j] = arr[j+1];
		    arr[j+1] = temp;
		}
	     }
	}
}

 

快速排序

 

原理:对于n个数,在其中选择一个中心值key(进行快排序的第一个数就可以作为key值,简单且防重复),从数组的第一个数Ai 从左往右找,找到第一个大于key的数,记为Ai,从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj,交换Ai 和Aj ,重复这个过程,直到 i=j(),调整key的位置,把A[i] 和key交换,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。

代码:

public static void quick_sort(int[] arr, int low, int high) {  
        if( low > high) {   //递归算法的出口  
            return;  
        }  
        int i = low;  
        int j = high;  
        int key = arr[ low ];  
        while( i< j) {  
            while(i<j && arr[j] > key){  //从右往左找到第一个小于key的数  
                j--;  
            }  
            while( i<j && arr[i] <= key) {  //从左往右找到第一个大于key的数  
                i++;  
            }  
            if(i<j) {  // 交换  
                int temp = arr[i];  
                arr[i] = arr[j];  
                arr[j] = temp;  
            }  
        }  
        int temp = arr[i];  
        arr[i] = arr[low];  
        arr[low] = temp;  // 调整key的位置  
        quick_sort(arr, low, i-1 );  // 对key左边的数快排  
        quick_sort(arr, i+1, high);  //对key右边的数快排  
 }

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值