交换类排序算法

#include<stdio.h>
/*
*交换类排序,每天一道算法题
*按照从小到大的顺序进行排序
* 毛施平
*/
//冒泡排序
void traverseArray(int *p,int length)
{
   int i=0;
   for(;i<length;i++)
   {
     printf("%d\n",p[i]);
   } 

}
//这个是最简单的
void bubbleSortOne(int *p,int length)
{
  int i=length;
  int j,temp;
  int lastChangeIndex;
  printf("简单一点:\n");
  while(i>1)
  {
   lastChangeIndex=1;
    for(j=0;j<i-1;j++)
    {
       if(p[j]>p[j+1])
       {
        temp=p[j];
        p[j]=p[j+1];
        p[j+1]=temp;
        lastChangeIndex=j;
       }
    }
   traverseArray(p,9);
   printf("\n");
   i=lastChangeIndex;
  }
}
//这个排序并不是最简单的
void bubbleSort(int *p,int length)
{
  int i,j,temp;
  for(i=0;i<length;i++)
  {
    for(j=0;j<length-i-1;j++)
    {
       if(p[j]>p[j+1])
       {
        temp=p[j];
        p[j]=p[j+1];
        p[j+1]=temp;
       }
    }
  }
}
//快速排序
int Partition(int *p,int low,int high)
{
  //int low=0,high=length-1;
  int temp=p[low];
  while(low<high)
  {
    while(low<high&&p[high]>=temp) high--;
       p[low]=p[high];
    while(low<high&&p[low]<=temp) low++;
       p[high]=p[low];
  }
  p[low]=temp;
  return low;
}
void QSort(int *p,int low,int high)
{
  if(low<high)
  {
   int pivotloc=Partition(p,low,high);
   traverseArray(p,9);
   printf("\n");
   QSort(p,low,pivotloc-1);
   QSort(p,pivotloc+1,high);
  }

}

int main()
{
  int a[]={9,2,1,4,5,7,3,8,6};
  bubbleSortOne(a,sizeof(a)/sizeof(int));
  int low=0;
  int high=sizeof(a)/sizeof(int)-1;
 // QSort(a,low,high);
  traverseArray(a,sizeof(a)/sizeof(int));

  system("pause");
  return 0;
}

冒泡排序和快速排序都属于交换类排序,最简单的冒泡排序需要考虑不

时间: 2024-10-12 16:35:27

交换类排序算法的相关文章

深入浅出交换类排序算法(转)

1)冒泡排序 冒泡排序在众多排序算法中算比较简单的一个,基本思想是重复的进行整个数列的排序,一次比较两个元素(两两排序),如果它们顺序不符合就交换,重复这样直到数列没有再需要交换的数为止(结束条件).就好像气泡一样,轻的气泡会往上漂浮,在不断漂浮的过程中,发生了两两交换过程,所以叫冒泡排序. 其实也可以用生活中的例子理解,就比如: 在军训排队时,按个子高的和个子矮的的顺序进行排列,个子高的和个子矮的会进行两两进行比较. 我们来大致看下算法的流程: 选一组序列 4, 3 , 5, 6, 2, 1 

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

基于相邻元素交换的排序算法的下界

逆序(inversion)是指序列中具有性质“i<j,但a[i]>a[j]“的序偶(a[i].a[j]). 例如:在序列34,8,64,51,32,21中具有9个逆序:(34,8),(34,32),(34,21),(64,51),(64,32),(64,21),(51,32),(51,21),(32,21): 显而易见的是,排序完成之后,序列中将不会存在逆序.因此我们可以通过计算序列中的逆序数来及算排序平均运行时间的精确的界.为了可以定义出“平均”,这里假设序列中不存在重复元素.利用这个假设,

交换类排序:冒泡,快速(递归与非递归)

<pre name="code" class="cpp">交换类排序:1:冒泡排序O(n^2),空间复杂度O(1) 2:快速排序O(n乘以log以2为底,n的对数),空间复杂度O(log以2为底,n的对数) //冒泡排序 void BubbleSort(int R[],int n) { int i,j,tmp,flag; for(i=0;i<n-1;i++) { flag=0; for(j=n-1;j>i;j--) { if(R[j]<

数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法

快速排序算法属于"交换类"的排序,它的效率主要跟数据分布是否对称有关. 升序排序: /** * 快速排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { if(data == null || data.length <= 1){ return; } partitionSortByAsc(data, 0, data.length -

详谈排序算法之交换类排序(两种方法实现快速排序【思路一致】)

1.冒泡排序    起泡排序的思想非常简单.首先,将 n 个元素中的第一个和第二个进行比较,如果两个元素的位置为逆序,则交换两个元素的位置:进而比较第二个和第三个元素关键字,如此类推,直到比较第 n-1 个元素和第 n 个元素为止:上述过程描述了起泡排序的第一趟排序过程,在第一趟排序过程中,我们将关键字最大的元素通过交换操作放到了具有 n 个元素的序列的最一个位置上.然后进行第二趟排序,在第二趟排序过程中对元素序列的前 n-1 个元素进行相同操作,其结果是将关键字次大的元素通过交换放到第 n-1

常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)

冒泡排序算法: 总的来说就是两两交换,反复直到有序,第一个记录和第二个记录,若逆序则交换,然后比较第二个和第三个记录,以此类推,直到第 n 个记录和第 n-1个记录比较完毕为止,第一趟排序,结果关键字最大的记录被安排在最后一个位置.对前 n-1个记录继续冒泡排序,使得关键字次大的记录安排在第 n-1个位置.如此重复,直到没有需要交换的记录为止(仅仅是第一个和第二个交换过为止).整个一趟趟的选出最值的过程,仿佛是那水里的气泡,咕嘟咕嘟的往上翻的过程. 递增冒泡排序过程图解: 一般先比较第一个元素和

三、基于交换的排序算法(冒泡排序和快速排序)

1.冒泡排序 基本思想:若从小到大排序,从头开始,两两比较,大的放在后面,将待排序元素从左到右比较一遍成为“一次冒泡”,每次冒泡都将待排序数列中最大的关键字交换到最后,直到所有元素有序为止. 算法复杂度:O(2^n) 改进方法:可能排序几次后,数列已经有序,但是还没有进行完n次循环.可以在交换的代码段中设置一个标志位,如果该标志位改变说明有交换(还未有序),否则用break退出循环. //1.冒泡排序 //注意数组下标溢出 void Bubble(int *array, int n) { int

常见排序算法——七大比较类排序算法

算法 最坏复杂度 平均复杂度 最好复杂度 空间复杂度 选择排序 O($n^2$) O($n^2$) O($n^2$) O(1) 插入排序 O($n^2$) O($n^2$) O($n$) O(1) 希尔排序 O($nlog(n))$~O($n^2$) O($n^{1.3}$) O($n^2$) O(1) 冒泡排序 O($n^2$) O($n^2$) O(n)(用交换flag改进) O(1) 快速排序 O($n^2$) O($nlog(n)$) O($nlog(n)$) O(log(n))~O(n