数据结构-常见数组排序(一)


代码由java实现

一、冒泡排序

1、原理

在冒泡排序中,将数组的每个元素与其相邻元素进行比较,此算法处理传递中的列表。 具有n个元素的列表需要n-1次传递以进行排序。 考虑一个n个元素的数组a,其元素将使用冒泡排序进行排序。算法处理如下。
在第1遍时,a[0]与a1进行比较,a1与a[2]进行比较,a[2]与a[3]进行比较,依此类推。 在第1遍结束时,列表的最大元素放在列表的最高索引处。
在第2遍时,a[0]与a1进行比较,a1与a[2]进行比较,依此类推。 在第2遍结束时,列表的第二大元素位于列表的第二高索引处。在通过n-1遍时,a[0]与a1进行较,a1与a[2]进行比较,依此类推。 在这个传球结束时。列表的最小元素放在列表的第一个索引处。

2、时间复杂度

最坏情况运行时间 O(n^2)
平均情况运行时间 O(n)
最好情况运行时间 O(n^2)

3、代码实现

package com.sort;

public class BubbleSort {
//冒泡排序
public static void main(String[] args) {
int a[] = { 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
System.out.println(“排序前:”);
printArray(a);
bubble(a);
System.out.println("\n排序后:");
printArray(a);
}

//冒泡排序方法
static void bubble(int [] a) {
	int temp;
	for(int i=0;i<a.length;i++) {
		for(int j=i+1;j<a.length;j++) {
			if(a[j]>a[i]) {
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
}
//遍历数组,打印输出
static void printArray(int a []) {
	for(int i=0;i<a.length;i++) {
		System.out.print(a[i]+"\t");
	}
}

}

3、 运行结果

在这里插入图片描述

二、插入排序

1、原理

插入排序是一种简单的排序算法。 在此算法中,将每个元素插入到排序数组中的适当位置。 这比其他排序算法(如快速排序,合并排序等)效率低。
考虑有一个数组a,其元素将要排序。 最初,a[0]是排序集上的唯一元素。 在第1遍中,a1被放置在数组中的适当索引处。
在第2遍中,a[2]被放置在数组中的适当索引处。 同样,在通过n-1中,A[n-1]被放置在其正确的索引中。
要将元素a[k]插入其正确的索引,需要将它与所有其他元素(即a[k-1],a[k-2]等)进行比较,直到找到元素a[j]为止 ,a[j] <= a[k]。
从a[k-1]到a[j]的所有元素都需要移位,a[k]将移动到a[j + 1]。

2、时间复杂度

最好情况 Ω(n)
平均情况 θ(n^2)
最差情况 θ(n^2)

3、代码实现

package com.sort;

扫描二维码关注公众号,回复: 5873291 查看本文章

public class InsertionSort {

public static void main(String[] args) {
	int a[] = { 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
    System.out.println("排序前:");
    printArray(a);
    insertion(a);
    System.out.println("\n排序后:");
    printArray(a);
}

//插入排序
static void  insertion(int a[]) {
	for(int i=0;i<a.length;i++) {
		int temp=a[i];
		int j=i-1;
		while(j>=0 && temp <= a[j]){  
            a[j+1] = a[j];   
            j = j-1;  
        }  
        a[j+1] = temp;  
	}
}

//遍历数组,打印输出
	static void printArray(int a []) {
		for(int i=0;i<a.length;i++) {
			System.out.print(a[i]+"\t");
		}
	}

}

4、运行结果

在这里插入图片描述

三、合并排序

1、原理

合并排序是遵循分而治之的方法。 考虑一下,假设有n个元素的数组A。该算法分3个步骤处理元素。
如果A包含0或1个元素,则它已经被排序,否则,将A分成两个具有相同数量元素的子数组。使用合并排序递归地对两个子数组进行排序。组合子数组以形成单个最终排序数组,维护数组的顺序。
合并排序背后的主要思想是,短列表需要较少的时间进行排序。

2、时间复杂度

最好情况 O(n log n)
平均情况 O(n log n)
最差情况 O(n log n)

3、代码实现

package com.sort;

public class MergeSort {
//合并排序
public static void main(String[] args) {
int a[] = { 25, 11, 7, 191, 23, 66, 12, 78, 34, 23};
System.out.println(“排序前:”);
printArray(a);
mergeSort(a,0,9);
System.out.println("\n排序后:");
printArray(a);
}

static void merge(int a[], int beg, int mid, int end){
	int i=beg,j=mid+1,k,index = beg;  
    int  temp[]=new int[10];  
    while(i<=mid && j<=end)  
    {  
        if(a[i]<a[j]){  
            temp[index] = a[i];  
            i = i+1;  
        }  
        else {  
            temp[index] = a[j];  
            j = j+1;   
        }  
        index++;  
    }  
    if(i>mid){  
        while(j<=end){  
            temp[index] = a[j];  
            index++;  
            j++;  
        }  
    }  
    else {  
        while(i<=mid){  
            temp[index] = a[i];  
            index++;  
            i++;  
        }  
    }  
    k = beg;  
    while(k<index) {  
        a[k]=temp[k];  
        k++;  
    }  

}

static void mergeSort(int a[], int beg, int end) {  
    int mid;  
    if(beg<end) {  
        mid = (beg+end)/2;  
        mergeSort(a,beg,mid);  
        mergeSort(a,mid+1,end);  
        merge(a,beg,mid,end);  
    }  
}  

//遍历数组,打印输出
		static void printArray(int a []) {
			for(int i=0;i<a.length;i++) {
				System.out.print(a[i]+"\t");
			}
		}

}

4、运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_40770656/article/details/88919365