若干基本內排序演算法(c語言)的備份,閒時來看看,以防忘記。
1.插入排序
void insertsort(elemtype x,int n)
int i,j;
elemtype temp;
for(i=0;itemp=x[i+1];
j=i;
while(j>-1&&temp.keyx[j+1]=x[j];
j--;
x[j+1]=temp;
2.選擇排序
void selectsort(elemtype x,int n)
int i,j,small;
elemtype temp;
for(i=0;ismall=i;
for(j=i+1;jif(x[j].keyif(small!=i)
temp=x[i];
x[i]=x[small];
x[small]=temp;
3.交換排序
void bubblesort(elemtype x,int n)
int i,j,flag=1;
elemtype temp;
for(i=0;iflag=0;
for(j=0;jif(x[j].key>x[j+1].key)
flag=1;
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
4.快速排序
void quicksort(elemtype x,int low,int high)
int i,j;
elemtype temp;
i=low;
j=high;
temp=x[low];
while(i//在序列的右端掃瞄
while(iif(ix[i]=x[j];
i++;
//在序列的左端掃瞄
while(iif(ix[j]=x[i];
j--//確定了x[low]在有序序列中的最終位置
x[i]=temp;//temp==x[low]
//對子序列進行快速排序
if(lowif(j+15.希爾排序
這個排序非常複雜,看了程式就知道了。
首先需要乙個遞減的步長,這裡我們使用的是9、5、3、1(最後的步長必須是1)。
工作原理是首先對相隔9-1個元素的所有內容排序,然後再使用同樣的方法對相隔5-1個元素的排序
以次類推。
#include <iostream.h>
void shellsort(int* pdata,int count)
int step[4];
step[0] = 9;
step[1] = 5;
step[2] = 3;
step[3] = 1;
int itemp;
int k,s,w;
for(int i=0;i<4;i++)
k = step;
s = -k;
for(int j=k;j<count;j++)
itemp = pdata[j];
w = j-k;//求上step個元素的下標
if(s ==0)
s = -k;
s++;
pdata[s] = itemp;
while((itemp<pdata[w]) && (w>=0) && (w<=count))
pdata[w+k] = pdata[w];
w = w-k;
pdata[w+k] = itemp;
void main()
int data = ;
shellsort(data,12);
for (int i=0;i<12;i++)
cout<<data<<" ";
cout<<"\n";
呵呵,程式看起來有些頭疼。不過也不是很難,把s==0的塊去掉就輕鬆多了,這裡是避免使用0
步長造成程式異常而寫的**。這個**我認為很值得一看。
避免使用2的冪次步長,它能降低演算法效率。」另外演算法的複雜度為n的1.2次冪。同樣因為非常複雜並
「超出本書討論範圍」的原因(我也不知道過程),我們只有結果了。
6.堆排序
// array是待調整的堆陣列,i是待調整的陣列元素的位置,length是陣列的長度
void heapadjust(int array, int i, int nlength)//本函式功能是:根據陣列array構建大根堆
int nchild;
int ntemp;
for (ntemp = array[i]; 2 * i + 1 < nlength; i = nchild)
// 子結點的位置=2*(父結點位置)+ 1
nchild = 2 * i + 1;
// 得到子結點中較大的結點
if (nchild < nlength - 1 && array[nchild + 1] > array[nchild])
++nchild;
// 如果較大的子結點大於父結點那麼把較大的子結點往上移動,替換它的父結點
if (ntemp < array[nchild])
array[i]= array[nchild];
else // 否則退出迴圈
break;
// 最後把需要調整的元素值放到合適的位置
array[nchild]= ntemp;
// 堆排序演算法
void heapsort(int array, int length)
// 調整序列的前半部分元素,調整完之後第乙個元素是序列的最大的元素
for (int i = length / 2 - 1; i >= 0; --i)
heapadjust(array, i, length);
// 從最後乙個元素開始對序列進行調整,不斷的縮小調整的範圍直到第乙個元素
for (int i = length - 1; i > 0; --i)
// 把第乙個元素和當前的最後乙個元素交換,
// 保證當前的最後乙個位置的元素都是在現在的這個序列之中最大的
swap(&array[0], &array[i]);
// 不斷縮小調整heap的範圍,每一次調整完畢保證第乙個元素是當前序列的最大值
heapadjust(array, 0, i);
各種排序演算法java實現,好文,做個備份
插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...