几种排序算法的实现

ゝ一纸荒年。 2023-06-11 12:21 76阅读 0赞

插入排序

  • 直接插入排序

    //对数组int A[n]进行直接插入排序
    void InsertSort(int A,int n){

    1. int j,temp;
    2. for(int i=1;i<n;i++){
    3. temp=A[i];//将当前待排序的元素存储在temp中
    4. j=i-1;//从当前待排元素的前一个元素开始扫描数组
    5. while(j>=0&&A[j]>temp){
    6. A[j+1]=A[j];
    7. j--;
    8. }
    9. R[j+1]=temp;//完成下标为i的元素的排序
    10. }

    }

  • 折半插入排序

    //对数组A[n]进行折半插入排序
    void InsertSort(int A[],int n){

    1. int temp,low,high,mid
    2. for(int i=1;i<n;i++){
    3. temp=A[i];//将当前待排序元素存储到temp中
    4. low=0;high=i-1;
    5. while(low<=high){
    6. //通过折半查找,找到待排序元素应该插入的位置为high+1;
    7. mid=(low+high)/2;
    8. if(A[mid]>temp) low=mid+1;
    9. else high=mid-1;
    10. }//折半查找结束
    11. //移动元素
    12. for(j=i;j>high+1;j--){
    13. A[j]=A[j-1];
    14. }
    15. A[j]=temp;//将下标为i的元素排好序
    16. }

    }

交换排序

  • 冒泡排序

    //对数组A[n]进行冒泡排序
    void BubbleSort(int A[],int n){

    1. bool flag;
    2. for(int i=0;i<n-1;i++){
    3. //n个元素最多进行n-1趟排序
    4. flag=false;
    5. for(int j=0;j<n-i-1;j++){
    6. if(A[j]>A[j+1]){
    7. swap(A[j],A[j+1]);//按照从大到小的顺序排列
    8. flag=true;
    9. }
    10. }
    11. if(flag==false) return;//如果某一趟冒泡结束,未发生交换,说明数组中的元素已经实现有序排列
    12. }

    }

  • 快速排序

  • 在待排序的列表中选择一个元素作为基准pivot,通过一趟排序将待排序表划分为两部分,一部分元素小于pivot,另一部分元素大于pivot,此时pivot放在了其最终位置上。而后递归的对其子表重复上述过程

    void QuickSort(int R[],int low,int high){

    1. int pivot,i,j;
    2. i=low;j=high;
    3. if(low<high){
    4. pivot=R[low];
    5. while(i!=j){
    6. while(j>i&&R[j]>pivot;j--)//从右向左
    7. if(j>i){
    8. R[i]=R[j];
    9. i++;
    10. }
    11. while(i<j&&R[i]<pivot;i++)//从左向右
    12. if(i<j){
    13. R[j]=R[i];
    14. j--;
    15. }
    16. }//当i=j,循环结束
    17. R[i]=pivot;//pivot最终位置确定
    18. QuickSort(R,low,i-1);
    19. QuickSort(R,i+1;high);
    20. }

    }

选择排序

  • 简单选择排序
  • 每一趟排序,找到待排序列中的最小元素,与该代派序列的第一个元素交换位置

    void SeleteSort(int A[],int n){

    1. int i;j;k;
    2. for(i=0;i<n;i++){
    3. k=i;
    4. for(j=i+1;j<n;j++){
    5. //寻找带排序列最小元素的下标
    6. if(A[j]<A[k])
    7. k=j;
    8. }
    9. swap(A[k],A[i]);
    10. }

    }

  • 设有一个数组为a1,a2…an,现要求将an放在排序后正确的位置上,实现该算法

    //使用快速排序,将an作为枢轴量
    void Sort(int A[],int low,int high){

    1. int i=low,j=high;
    2. int pivot;
    3. if(i>=j) return;
    4. while(i!=j){
    5. pivot=A[j];
    6. while(i<j&&A[i]<pivot)
    7. i++;
    8. if(i<j){
    9. A[j]=A[i];
    10. j--;
    11. }
    12. while(i<j&&A[j]>pivot)
    13. j--;
    14. if(i<j){
    15. A[i]=A[j];
    16. i++;
    17. }
    18. }
    19. A[i]=pivot;

    }

  • 输入一个整数数组,调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分

  • 奇数和奇数、偶数和偶数之间的相对位置可变

    //使用快速排序
    void Sort(int A[],int low,int high){

    1. int i=low,j=high;
    2. int pivot;
    3. if(i>=j) return;
    4. while(i!=j){
    5. pivot=A[i];
    6. while(i<j&&A[j]%2==0)
    7. j--;
    8. if(i<j){
    9. A[i]=A[j];
    10. i++;
    11. }
    12. while(i<j&&A[i]%2==1)
    13. i++;
    14. if(i<j){
    15. A[j]=A[i];
    16. j--;
    17. }
    18. }//while
    19. A[i]=pivot;

    }

  • 奇数奇数、偶数偶数之间的相对位置不可变

    //方法一:使用冒泡排序
    void Sort(int A[],int n){

    1. //如果是前偶后奇则交换位置
    2. bool flag;
    3. for(int i=0;i<n-1;i++){
    4. for(int j=0;j<n-1-1;j++){
    5. if(A[j]%2==0&&A[j+1]%2==1){
    6. temp=A[j];
    7. A[j]=A[j+1];
    8. A[j+1]=temp;
    9. flag=true;
    10. }
    11. }//for
    12. if(flag==false) return;
    13. }//for

    }

    //方法二:创建辅助数组
    void Sort(int A[],int n){

    1. int a[n],int b[n];
    2. int j=0,k=0;
    3. for(int i=0,i<n;i++){
    4. if(A[i]%2==0){
    5. a[j++]=A[i];
    6. }else{
    7. b[k++]=A[i];
    8. }
    9. }
    10. int t=0;
    11. for(;j<n;j++){
    12. a[j]=b[t];
    13. t++;
    14. }

    }

  • 带头结点的双向链表,对其进行双向起泡法升序排列

    bool doublebubbleSort(DLinkList &L){

    1. DLinkList *p,*q=NULL;
    2. bool flag=true;
    3. while(flag==true){
    4. p=L->next;
    5. flag=false;
    6. while(p->next!=q){
    7. if(p->data>p->next->data){
    8. swap(p->data,p->next-data);
    9. flag=true;
    10. }
    11. p=p->next;
    12. }//while
    13. q=p;
    14. p=q->prior;
    15. while(p->prior!=L){
    16. if(p->data<p->prior->data){
    17. swqp(p->data,p->prior->data);
    18. flag=true;
    19. }
    20. p=p->prior;
    21. }//while
    22. L=p;//下次起泡的起点
    23. }

    }

发表评论

表情:
评论列表 (有 0 条评论,76人围观)

还没有评论,来说两句吧...

相关阅读