数据结构-常见数组排序
代码由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;
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");
}
}
}