冒泡排序,插入排序,归并排序,快速排序的学习笔记

Posted Madao东治

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序,插入排序,归并排序,快速排序的学习笔记相关的知识,希望对你有一定的参考价值。

这几个很基础的排序非常有用,我重新整理了下代码

 

  1 #include<iostream>
  2 #include<algorithm>
  3 
  4 using namespace std;
  5 
  6 void Bouble_Sort(int * Arry,int Lenth)      //冒泡排序
  7 {
  8     int i,k;
  9     
 10     int flag = 0;
 11     
 12     for(i = Lenth - 1;i >= 0; i--)
 13     {
 14         for(k=0;k<i;k++)
 15         {
 16             if(Arry[k] > Arry[k+1])
 17             {
 18                 swap(Arry[k],Arry[k+1]); //如果存在前一个比后一个大的情况,则交换两个数字
 19                 
 20                 flag = 1;                //Flag的作用是判断 这个数组是否已经排完序了,如果已经是顺序了,就不再进行排序了
 21             }
 22         }
 23         
 24         if(flag == 0)
 25             break;
 26     }
 27 }
 28 
 29 //插入排序
 30 
 31 void Insert_Sort(int * Arry,int Lenth)
 32 {
 33     int i,k;
 34     
 35     int TempNumb = 0 ;
 36     
 37     for(i = 0; i < Lenth; i++)
 38     {
 39         TempNumb = Arry[i];         //从0到i的所有数
 40         
 41         for(k = i;k>0 && Arry[k] > TempNumb;k++) //如果有这个数的前面几位,大于了他,那么这个数的后面几位全部向后移动一位
 42         {
 43             Arry[k+1] = Arry[k];     //整体向后移动         
 44         }
 45         
 46         Arry[k] = TempNumb;              
 47     }
 48 }
 49 /*
 50 说下插入排序的思路: 一开始选择的数字在最左边,所以没的比较,保持在最左端,然后第二个数会和第一个数比较,如果较大
 51 则第一个数会向后移动一位,注意这里移动的范围始终在最外面这层循环,即i的大小。
 52 */
 53 
 54 
 55 //归并排序
 56 void Merge(int * Arry,int * TempArry,int Left,int Right,int Rightend)
 57 {
 58     int LeftEnd = Right - 1;
 59     
 60     int totalNumb = Rightend - Left + 1;
 61     
 62     int Pointer = Left;
 63     
 64     int i;
 65     
 66     while(Left <= LeftEnd && Right <= Rightend)
 67     {
 68         if(Arry[Left] < Arry[Right])
 69             TempArry[Pointer++] = Arry[Left++];
 70         else 
 71             TempArry[Pointer++] = Arry[Right++];
 72     }
 73     
 74     while(Left <= LeftEnd)
 75         TempArry[Pointer++] = Arry[Left++];
 76     
 77     while(Right <= Rightend)
 78         TempArry[Pointer++] = Arry[Right++];
 79     
 80     for(i=0;i<totalNumb;i++,Rightend--)
 81     {
 82         Arry[Rightend] = TempArry[Rightend];
 83     }
 84     
 85 }
 86 
 87 void Merge_Sort(int * Arry,int * TempArry,int Left,int Rightend) //插入排序使用了分治的思路 
 88 {
 89     int Mid;
 90     
 91     if(Rightend > Left)
 92     {
 93         Mid = (Left + Rightend) / 2;
 94         
 95         Merge_Sort(Arry,TempArry,Left,Mid);
 96         
 97         Merge_Sort(Arry,TempArry,Mid+1,Rightend);
 98         
 99         Merge(Arry,TempArry,Left,Mid+1,Rightend);
100     }
101 }
102 
103 int Partation(int * Arry,int Low,int High)   //寻找中间值
104 {
105     int KeyNumb;                                
106     
107     KeyNumb = Arry[Low];                   // 首先默认最左端的值为KeyNumb
108     
109     while(Low < High)
110     {
111         while(Low < High && Arry[Low] < Arry[High]) //当 High > Low的时候, Low指针向前移动,一直到 arry.high < arry.Low,
112             Low++;
113         
114         swap(Arry[Low],Arry[High]); //交换两个值
115         
116         while(Low < High && Arry[High] > Arry[Low])
117             High--;
118         
119         swap(Arry[Low],Arry[High]);
120     }
121     
122     return Low;      //此时Low所处的位置,arry[Low] 已经排好序了,也就是该位置是最终位置
123 }
124 
125 
126 
127 void Quick_Sort(int * Arry,int Low,int High) //快速排序
128 {
129     int KeyNumb;
130     
131     if(High > Low)
132     {
133         KeyNumb = Partation(Arry,Low,High);       //分治算法
134         
135         Quick_Sort(Arry,Low,KeyNumb - 1);        //对左边进行递归
136         
137         Quick_Sort(Arry,KeyNumb+1,High);         //对右边进行递归
138         
139     }
140 }
141 
142 int main()
143 {
144     int i;
145     
146     int Arry[10] = {10,9,8,7,6,5,4,3,2,1};
147     
148     int TempArry[10] = {0};
149     
150     //Bouble_Sort(Arry,10);
151     
152     //Insert_Sort(Arry,10);
153     
154     //Merge_Sort(Arry,TempArry,0,10);
155     
156     //Quick_Sort(Arry,0,9);
157     
158     for(i=0;i<10;i++)
159     {
160         cout << Arry[i] << ;
161     }
162 }

 

以上是关于冒泡排序,插入排序,归并排序,快速排序的学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

C# 各种内部排序方法的实现(直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序)

C# 各种内部排序方法的实现(直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序)

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

JAVA实现经典排序算法(冒泡排序选择排序插入排序希尔排序堆排序归并排序快速排序)

Python八大算法的实现,插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序。

Java学习笔记之十一Java中常用的8大排序算法详解总结