选择排序、冒泡排序、插入排序、归并排序总结
先上代码
选择排序
选择排序每次从数组中找出最小的数和首位进行交换,依次进行直到只剩最后一位
因此外层for循代表需要从a[0]开始找a.length-1次最小值(最后一位不需要找肯定是最小)
内层for循环代表从第i位开始到a.length-1找最小值
public class test {
public static void main(String[] args) {
int a[] = new int[(int)(Math.random()*20+1)];
for(int i = 0; i<a.length; i++){
a[i]=(int) (Math.random()*100);
}
sort(a);
for(int i = 0; i<a.length ;i++){
System.out.println(a[i]);
}
}
public static void sort(int a[]){
if(a.length == 0 || a.length < 2)
return;
int min , t;
for(int i = 0; i < a.length-1; i++){
min = i;
for(int q = i ;q < a.length; q++){
if(a[q] < a[min]){
min = q;
}
}
if(min != i){
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
}
冒泡排序
冒泡排序和选择排序的不同之处就在于冒泡排序每次的比较过程都进行交换而不是和选择排序一样只记录当前这趟查找的最小值
public class test {
public static void main(String[] args) {
int a[] = new int[(int)(Math.random()*20+1)];
for(int i = 0; i<a.length; i++){
a[i]=(int) (Math.random()*100);
}
sort(a);
for(int i = 0; i<a.length ;i++){
System.out.println(a[i]);
}
}
public static void sort(int a[]){
if(a.length == 0 || a.length < 2)
return;
int t = 0;
for(int i = a.length-1; i > 0; i--){
for(int q = 0 ;q < i; q++){
if(a[q] > a[q+1]){
t = a[q];
a[q] = a[q+1];
a[q+1] = t;
}
}
}
}
}
插入排序
public class test {
public static void main(String[] args) {
int a[] = new int[(int)(Math.random()*20+1)];
for(int i = 0; i<a.length; i++){
a[i]=(int) (Math.random()*100);
}
sort(a);
for(int i = 0; i<a.length ;i++){
System.out.println(a[i]);
}
}
public static void sort(int a[]){
if(a.length == 0 || a.length < 2)
return;
int min , t;
for(int i = 1; i < a.length; i++){
for(int q = i; q > 0; q--){
if(a[q]<a[q-1]){
t=a[q];
a[q]=a[q-1];
a[q-1]=t;
}
}
}
}
}
归并排序
归并排序运用了分治的思想,通过二分、合并来排序。归并排序之所以可以比前三种排序更快,是因为它避免了不必要的比较与交换,每次合并时不再需要排序只需要比较两个已经排好序的数组即可。因此归并排序的时间复杂度为O(N*logN)。
public class test {
public static void main(String[] args) throws UnknownHostException {
int a[] = new int[(int)(Math.random()*20+1)];
for(int i = 0; i<a.length; i++){
a[i]=(int) (Math.random()*100);
}
sort(a,0,a.length-1);
for(int i = 0; i<a.length ;i++){
System.out.println(a[i]);
}
}
public static void sort(int a[],int l,int r){
if(l == r)
return ;
int mid = (l+r)/2;
sort(a,l,mid);
sort(a,mid+1,r);
merge(a,l,mid,r); //合并数据
}
public static void merge(int a[],int l,int mid,int r){
int help[] = new int [r-l+1]; //用于暂时保存合并数据
int p1 = l,p2 = mid+1;
int i = 0;
int sum = 0;
while(p1 <= mid&& p2 <= r){
help[i++] = a[p1]<a[p2] ? a[p1++] : a[p2++];
}
while(p1 <= mid){ //将剩余元素直接拷贝给help
help[i++] = a[p1++];
}
while(p2 <= r){
help[i++] = a[p2++];
}
for(int q = 0; q<help.length; q++){
a[q+l] = help[q];
}
}
}