排序算法

来源:互联网 发布:wan端口未连接 编辑:程序博客网 时间:2024/06/06 09:19

Point 1:
插入排序
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。

public class InsertSort {      public static void main(String[] args) {        int a[]={38,49,65,78,34,12,64};          int temp=0;          for(int i=1;i<a.length;i++){            int j=i-1;             temp=a[i];              for(;j>=0&&temp<a[j];j--){                      a[j+1]=a[j];                       //将大于temp的值整体后移一个单位                  }              a[j+1]=temp;            }          for(int i=0;i<a.length;i++)              System.out.println(a[i]);        }  }

Point 2:
冒泡排序
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

public class MaoPao {    public static void main(String[] args) {        int[] arr = {1,5,3,4,2,6};        for(int i = 0 ;i<arr.length-1;i++)            for(int j = 0 ; j<arr.length-1-i;j++){                if(arr[j] > arr[j+1]){                    int temp = arr[j+1];                    arr[j+1] = arr[j];                    arr[j] = temp;                }            }        for(int i=0;i<arr.length;i++)            System.out.println(arr[i]);    }}

Point 3:
选择排序
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

public class SelectSort {      public static void main(String[] args) {        int a[]={1,54,6,3,78,34,12,45};          int position=0;          for(int i=0;i<a.length;i++){              position=i;  //1            int temp=a[i]; //54             for(int j = i+1;j<a.length;j++){                  if(a[j]<temp){                      temp=a[j];  //6                    position=j;  //3                }              }              a[position]=a[i]; //             a[i]=temp;          }          for(int i=0;i<a.length;i++)              System.out.println(a[i]);      }  } 

Point 4:
快速排序
1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

void print(int a[], int n){      for(int j= 0; j<n; j++){          cout<<a[j] <<"  ";      }      cout<<endl;  }  void swap(int *a, int *b)  {      int tmp = *a;      *a = *b;      *b = tmp;  }  int partition(int a[], int low, int high)  {      int privotKey = a[low];                             //基准元素      while(low < high){                                   //从表的两端交替地向中间扫描          while(low < high  && a[high] >= privotKey) --high;  //从high 所指位置向前搜索,至多到low+1 位置。将比基准元素小的交换到低端          swap(&a[low], &a[high]);          while(low < high  && a[low] <= privotKey ) ++low;          swap(&a[low], &a[high]);      }      print(a,10);      return low;  }  void quickSort(int a[], int low, int high){      if(low < high){          int privotLoc = partition(a,  low,  high);  //将表一分为二          quickSort(a,  low,  privotLoc -1);          //递归对低子表递归排序          quickSort(a,   privotLoc + 1, high);        //递归对高子表递归排序      }  }  int main(){      int a[10] = {3,1,5,7,2,4,9,6,10,8};      cout<<"初始值:";      print(a,10);      quickSort(a,0,9);      cout<<"结果:";      print(a,10);  }  

Point 5:
归并排序
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
1、j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标
2、若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束
3、//选取r[i]和r[j]较小的存入辅助数组rf
如果r[i]

void print(int a[], int n){      for(int j= 0; j<n; j++){          cout<<a[j] <<"  ";      }      cout<<endl;  }  //将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n]  void Merge(ElemType *r,ElemType *rf, int i, int m, int n)  {      int j,k;      for(j=m+1,k=i; i<=m && j <=n ; ++k){          if(r[j] < r[i]) rf[k] = r[j++];          else rf[k] = r[i++];      }      while(i <= m)  rf[k++] = r[i++];      while(j <= n)  rf[k++] = r[j++];      print(rf,n+1);  }  void MergeSort(ElemType *r, ElemType *rf, int lenght)  {       int len = 1;      ElemType *q = r ;      ElemType *tmp ;      while(len < lenght) {          int s = len;          len = 2 * s ;          int i = 0;          while(i+ len <lenght){              Merge(q, rf,  i, i+ s-1, i+ len-1 ); //对等长的两个子表合并              i = i+ len;          }          if(i + s < lenght){              Merge(q, rf,  i, i+ s -1, lenght -1); //对不等长的两个子表合并          }          tmp = q; q = rf; rf = tmp; //交换q,rf,以保证下一趟归并时,仍从q 归并到rf      }  }  int main(){      int a[10] = {3,1,5,7,2,4,9,6,10,8};      int b[10];      MergeSort(a, b, 10);      print(b,10);      cout<<"结果:";      print(a,10);  }