C语言实现冒泡、插入、选择、快速排序

来源:互联网 发布:自制单片机最小系统 编辑:程序博客网 时间:2024/05/16 19:30
//============================================================================
// Name        : sorts.cpp
// Author      : zhoudan
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================


#include <iostream>
using namespace std;


/*一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置中
重复步骤2~5*/
void insert_sort(int *a,int n)
{
int i,j,temp;
for(i = 1;i<n;i++)
{
temp = a[i];
j = i-1;
//这里要注意,如果j=i,则j>0;若j=i-1,则j>=0,
//a[i]从后往前遍历,找到比它大的则后移一位,最终把a[i]插入到合适的位置上
while(temp<a[j] && j>=0)
{
if(temp<a[j])
{
a[j+1] = a[j];
}
j--;
}
a[j+1] = temp;
}
}


/*bubble_sort:冒泡排序,思想就是每次遍历都把最大的数组元素移到最右边,i只是为了让j与j-1比较n-i次。
 *
 * */
void bubble_sort(int a[],int n)
{
int i,j,temp;
for(i = 0;i<n;i++)
{
for(j = 1;j<n-i;j++)//注意是比较n-i次
{
if(a[j-1]>a[j])
{
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
}


// 用于对数组进行选择排序法操作
    // 参数a为需要排序的数组
    // 参数n为需要排序数组的元素个数
void selectsort(int *a,int n)
    {
        int i;
        int j;
        int temp = 0;
        int flag = 0;
        for(i = 0; i < n-1; i++) // 大循环,用于控制程序不再对已经排好序的数进行操作
        {
            temp = a[i];
            flag = i;
            for(j = i+1; j < n; j++) // 小循环,用于从前往后扫描数组并选择最小数
            {
                if(a[j] < temp)
                {
                    temp = a[j];
                    flag = j; // 目前最小的元素的下标
                }
            }
            if(flag != i) // 如果最小的元素不是进行筛选的数据中的第一个,则将最小数据与第一个筛选数据交换
            {
                a[flag] = a[i];
                a[i] = temp;
            }
        }
}


/*选择排序,通过i控制比较次数,每次把最小数排到数组的最前列,再比较未排好序的数。这样就排好序了
 * */
void choice_sort(int a[],int n)
{
int i,j,min,temp;
for(i = 0;i<n-1;i++)//用于控制程序不在对已经排好序的数进行操作
{
min = i; //最小数的下标
temp = a[i];
for(j = i+1;j<n;j++)//遍历找出最小的数,
{
if(a[min]>a[j])
{
min = j;
temp = a[j];
}
}
if(min!=i) //当i!=min的时候就把找出的最小数与a[i]交换,此时最小数排在最前面
//再经过n-1次比较就可以排好序了
{
a[min] = a[i];
a[i] = temp;
}
}
}


/*快速排序,采用二分法的思想,找到一个中间值,另所有小于它的值排列在其左边,大于它的值排列在右边,然后递归调用
 * */
void quick_sort(int a[],int left,int right)
{
   int i,j,temp;
   i=left;
   j=right;
   temp=a[left];
   if(left>right)
      return;
   while(i!=j)/*找到最终位置*/
   {
  //这里注意了,因为初始设置temp=a[left],所以因该先从右边开始比较!否则会出错!
  while(a[j]>=temp && j>i)
      j--;
       if(j>i)
      a[i++]=a[j];
       while(a[i]<=temp && j>i)
          i++;
       if(j>i)
          a[j--]=a[i];


   }
   a[i]=temp;
   quick_sort(a,left,i-1);
   quick_sort(a,i+1,right);/*递归右边*/
}




void print_sort(int a[],int n)
{


for(int i = 0;i<n;i++)
printf("%d ",a[i]);
}


int main() {
int a[8] = {2,4,1,6,5,9,3,7};
cout<<"after choice_sort"<<endl;
choice_sort(a,8);
print_sort(a,8);


int b[8] = {2,4,1,6,5,9,3,7};
cout<<endl<<"after bubble_sort"<<endl;
bubble_sort(b,8);
print_sort(b,8);


int c[8] = {2,4,1,6,5,9,3,7};
cout<<endl<<"after insert_sort"<<endl;
insert_sort(c,8);
print_sort(c,8);


int d[8] = {2,4,1,6,5,9,3,7};
cout<<endl<<"after quick_sort"<<endl;
quick_sort(d,0,7);
print_sort(d,8);
return 0;
}
0 0
原创粉丝点击