冒泡排序,插入排序,归并排序,快速排序的学习笔记
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实现经典排序算法(冒泡排序选择排序插入排序希尔排序堆排序归并排序快速排序)