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

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

 

  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 }

 

posted @ 2016-11-12 17:59  Madao东治  阅读(476)  评论(0编辑  收藏  举报