【笔记】排序算法总结

 一、直接插入排序

  最简单的排序,其基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

void InsertSort(int* pData,int Count) 
{ 
  int iTemp; 
  int iPos; 
  for(int i=1;i<Count;i++) 
  { 
    iTemp = pData[i]; 
    iPos = i-1; 
    while((iPos>=0) && (iTemp<pData[iPos])) 
    { 
      pData[iPos+1] = pData[iPos]; 
      iPos--; 
    } 
    pData[iPos+1] = iTemp; 
  } 
} 

倒序(最糟情况)
  第一轮:10,9,8,7->9,10,8,7(交换1次)(循环1次)
  第二轮:9,10,8,7->8,9,10,7(交换1次)(循环2次)
  第一轮:8,9,10,7->7,8,9,10(交换1次)(循环3次)
循环次数:6次 ;交换次数:3次

其他:
  第一轮:8,10,7,9->8,10,7,9(交换0次)(循环1次)
  第二轮:8,10,7,9->7,8,10,9(交换1次)(循环2次)
  第一轮:7,8,10,9->7,8,9,10(交换1次)(循环1次)
循环次数:4次 ;交换次数:2次


二、冒泡排序

  在冒泡排序的过程中,关键字较小的记录好比水中的气泡逐趟向上飘浮。过程:将第一个关键字与第二个关键字进行比较,如果逆序,则交换,然后将第二个关键字与第三个关键字比较,依次直到最后,这样最小的关键字就被排到了第一个位置上;然后从第二个关键字开始重复进行先前的步骤。另外,判断冒泡排序结束的条件是:在一趟排序过程中没有进行过交换记录的操作。

void BubbleSort(int* pData,int Count) 
{ 
  int iTemp; 
  BOOL exchange_flag;
  for(int i=1;i<Count;i++) 
  { 
    for(int j=Count-1;j>=i;j--) 
    { 
      exchange_flag = FALSE;
      if(pData[j]<pData[j-1]) 
      { 
        iTemp = pData[j-1]; 
        pData[j-1] = pData[j]; 
        pData[j] = iTemp; 
        exchange_flag = TRUE;
      } 
       if(!exchange_flag) return;
    } 
  } 
} 

倒序(最糟情况)
  第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)
  第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)
  第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次 ;交换次数:6次

其他:
  第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)
  第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)
  第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次 ;交换次数:3次


三、选择排序

  基本思想:从数据中选择最小的同第一个值交换,在从省下的部分中 选择最小的与第二个交换,这样往复下去。

void SelectSort(int* pData,int Count) 
{ 
  int iTemp; 
  int iPos; 
  for(int i=0;i<Count-1;i++) 
  { 
    iTemp = pData[i]; 
    iPos = i; 
    for(int j=i+1;j<Count;j++) 
    { 
      if(pData[j]<iTemp) 
      { 
        iTemp = pData[j]; 
        iPos = j; 
      } 
    } 
    pData[iPos] = pData[i]; 
    pData[i] = iTemp; 
  } 
} 

倒序(最糟情况)
  第一轮:10,9,8,7->(iTemp=9)10,9,8,7->(iTemp=8)10,9,8,7->(iTemp=7)7,9,8,10(交换1次)
  第二轮:7,9,8,10->7,9,8,10(iTemp=8)->(iTemp=8)7,8,9,10(交换1次)
  第一轮:7,8,9,10->(iTemp=9)7,8,9,10(交换0次)
循环次数:6次 ;交换次数:2次

其他:
  第一轮:8,10,7,9->(iTemp=8)8,10,7,9->(iTemp=7)8,10,7,9->(iTemp=7)7,10,8,9(交换1次)
  第二轮:7,10,8,9->(iTemp=8)7,10,8,9->(iTemp=8)7,8,10,9(交换1次)
  第一轮:7,8,10,9->(iTemp=9)7,8,9,10(交换1次)
循环次数:6次 ;交换次数:3次


四、快速排序

  首先我们选择一个中间值middle程序中我们使用数组中间值,然后 把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使 用这个过程(最容易的方法——递归)。

void run(int* pData,int left,int right) 
{ 
  int i,j; 
  int middle,iTemp; 
  i = left; 
  j = right; 
  middle = pData[(left+right)/2]; //求中间值 
  do{ 
    while((pData[i]<middle) && (i<right))//从左扫描大于中值的数 
      i++;      
    while((pData[j]>middle) && (j>left))//从右扫描大于中值的数 
      j--; 
    if(i<=j)//找到了一对值 
    { 
      //交换 
      iTemp = pData[i]; 
      pData[i] = pData[j]; 
      pData[j] = iTemp; 
      i++; 
      j--; 
    } 
  }while(i<=j);//如果两边扫描的下标交错,就停止(完成一次) 

  //当左边部分有值(left<j),递归左半边 
  if(left<j) 
    run(pData,left,j); 
  //当右边部分有值(right>i),递归右半边 
  if(right>i) 
    run(pData,i,right); 
} 

void QuickSort(int* pData,int Count) 
{ 
  run(pData,0,Count-1); 
} 

 


五、希尔排序

  也称为缩小增量排序,基本思想:先将整个待排序记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。


六、比较

 

  

posted @ 2012-07-19 19:29  让linux飞一会儿  阅读(692)  评论(0编辑  收藏  举报