选择 冒泡 插入 快排 堆排序 排序
2013-11-25 18:36
169 查看
几种常用的排序算法。冒泡排序,选择排序,插入排序,快排。(这里认为是升序)
冒泡排序的原理:每次把相邻的元素比较大小,把剩余的元素中的最大只向后移动,n-1次后数组就成为升序的。
冒泡排序代码如下:
for(int i = 0; i < n; i ++)
for(int j =1;j < n -i; j ++)
if(a[j] < a[j - 1])
{
int t = a[j - 1] ;
a[j -1] = a[j] ;
a[j] = t ;
}
选择排序的原理:每次在剩余的元素中选择一个最大值,使数组有序。
代码如下:
for(int i =0; i < n; i ++)
{
int maxn = i ;
for(int j = 0; j < n - i; j ++)
if(a[j] > maxn)
maxn = j ;
int t = a[maxn] ;
a[maxn] = a[n - i - 1] ;
a[n - i - 1] = t ;
}
插入排序原理:把一个值从尾部逐次比较,直到大于等于前面的值为至。
代码如下:
void selfinsert()
{
for(int i = 0; i < n; i ++)
{
int temp = a[i] ;
int k = i ;
for(int j = i -1; j >= 0; j --)
{
if(a[j] > temp)
{
a[j + 1] = a[j] ;
k = j ;
}
}
a[k] = temp ;
}
}
下面有个程序代码:
#include <iostream>
#define mx 50
using namespace std;
int a[mx] ;
int n ;
void selfinsert()
{
for(int i = 0; i < n; i ++)
{
int temp = a[i] ;
int k = i ;
for(int j = i -1; j >= 0; j --)
{
if(a[j] > temp)
{
a[j + 1] = a[j] ;
k = j ;
}
}
a[k] = temp ;
}
}
int main()
{
while(cin >> n)
{
for(int i = 0; i < n; i ++)
{
cin >> a[i] ;
}
selfinsert() ;
for(int i = 0; i < n; i ++)
{
cout << a[i] << " " ;
}
cout << endl;
}
return 0 ;
}
完善下sort()排序吧。
快排的思想是:通过一次分割,将无序序列分成两部分,其中前一部分的元素不大与后一部分的元素。然后用同样的方法,把前一部分和后一部分排序。知道排序完成。
对序列a的分割过程:首先,在序列的第一个,中间一个及最后一个元素中选取中项,得a(k),然后设置两个指针i和j分别指向序列的第一个和最后一项。
代码如下:
void selfsort(int left , int right)
{
int i = left ;
int j = right ;
int temp = a[(right + left)/2] ;
while(i <= j){
while(i <= right && a[i] < temp)i ++ ;
while(j >= left && a[j] > temp) j -- ;
if(i <= j){//关键的地方
swap(a[i], a[j]) ;
i ++ ;
j -- ;
}
cout << "now" << endl;
}
cout << "--------------" <<endl ;
for(int k = left; k <= right; k ++)
cout << a[k] <<" " ;
cout << "****************" << endl ;
if(i < right) selfsort(i , right) ;
if(j > left) selfsort(left , j);
}
对于这个程序,上面的关键点非常重要,如果写为if(i < j)你会发现会出现死循环。为什么那?因为不执行i == j , swap(a[i] , a[j]) , i ++ , j ++;
i 会一直等于j,并且会一直执行
if(i < right) selfsort(i , right) ;
if(j > left) selfsort(left , j);
这两个语句。所以要小心呀!别自以为是。
这里再介绍一种算法------堆排序
堆排序的原理:如果是按升序排。首先把数组建为最小堆,最小堆的根结点a[1]一定是数组中的最小值.所以每次把根结点a[1]与a
交换。在把剩余的元素再建为最小堆,在把a[1]与a[n-1]交换。重复次过程n次。
代码如下:
#include <iostream>
#include <cmath>
#define mx 50
using namespace std;
int a[mx] ;
int n ;
void adjust(int i , int j)
{
int child ;
while(i <= j / 2)
{
child = 2 * i ;
if(child + 1 <= j && a[child] > a[child + 1])
{
child ++;
}
if(a[i] > a[child])
swap(a[i] , a[child]) ;
else
return ;
i = child ;
}
}
int main()
{
while(cin >>n)
{
for(int i = 1; i <= n; i ++)
cin >> a[i] ;
for(int i = n; i >= 1; i --)
{
for(int j = i/2; j >= 1; j --)
{
adjust(j , i);
}
swap(a[1] , a[i]) ;
}
cout << "---------------" << endl;
for(int i = 1; i <=n; i ++)
cout << a[i] <<" ";
cout << endl;
}
return 0 ;
}
按升序的做法与上面的类似。
每次建最大堆。则a[1]是数组中的最大值。
第一次a[1] <--->a
第二次a[1] <--->a[n-1]
第三次a[1] <--->a[n-2]
第四次a[1] <--->a[n-3]
.........
代码如下:
#include <iostream>
#include <cmath>
#define mx 50
using namespace std;
int a[mx] ;
int n ;
void adjust(int i , int j)
{
int child ;
while(i <= j / 2)
{
child = 2 * i ;
if(child + 1 <= j && a[child] < a[child + 1])
{
child ++;
}
if(a[i] < a[child])
swap(a[i] , a[child]) ;
else
return ;
i = child ;
}
}
int main()
{
while(cin >>n)
{
for(int i = 1; i <= n; i ++)
cin >> a[i] ;
for(int i = n; i >= 1; i --)
{
for(int j = i/2; j >= 1; j --)
{
adjust(j , i);
}
swap(a[1] , a[i]) ;
}
cout << "---------------" << endl;
for(int i = 1; i <=n; i ++)
cout << a[i] <<" ";
cout << endl;
}
return 0 ;
}
相关文章推荐
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 排序总结:插入(简单和改进)、希尔、选择、冒泡、快速、堆排序、归并排序
- 常用的排序算法:冒泡,简单选择,直接插入,快速排序,堆排序
- 常用排序算法(冒泡、插入、选择、快速排序、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- C语言常用排序——直接插入,冒泡,选择,希尔,快速,堆排序
- c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
- 六大排序(选择,插入,冒泡,希尔,快排,堆排序)
- 排序大全【各种排序】:直接插入,折半插入,冒泡,快排,简单选择,堆排序,归并排序
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 冒泡,选择,插入排序优化,堆排序和qsort的用法
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)【转载】
- 九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序
- 数组排序(冒泡、选择、插入、快排、希尔、桶排序、堆排序)
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)