(1)冒泡排序:每次循环选出最小的放到前面,进行交换。
for(int i=0;i<size;i++){
for(int j=i+1;j<size;j++){
if(data[i]<data[j]){
gu.SwapTowData(data[i],data[j]);
}
}
}
(2)选择排序:每次从剩下的元素中选择一个最小的,但是不交换,只记录位置最后在交换。
for (int i = 0; i <size; i++)
{
int index = i;
int min = data[i];
for(int j=i+1;j<size;j++){
if(data[j] > min){
index = j;
min = data[j];
}
}
if(index != i)
gu.SwapTowData(data[i],data[index]);
}
(3)插入排序:将元素向已经排序好的数据中插入。即:每次交换大小位置不同的元素。
for(int i=1;i<num;i++){
for(int j=0;j<i;j++){
if(data[j]<data[i]){
gu.SwapTowData(data[i],data[j]);
}
}
}
(4)快速排序:选出一个基元素,将大于基元素放右边,小于的放左边,进行挖坑交换,每次选一个大的,然后选一个小的,到指针在同一个位置,将基元素房进去。
void SortProcess(T* &data, int start, int end){
int base = data[start];
int pos = start;
int i = start + 1;
int j = end;
while(i<j){
for (; j > i; j--)
{
if(base<data[j]){
data[pos] = data[j];
pos = j;
break;
}
}
for (;i<j; i++)
{
if(base>data[i]){
data[pos] = data[i];
pos = i;
break;
}
}
}
data[pos] = base;
}
void Sort(T* &data, int start, int end){
if(data == NULL || end <= start || end <0 || start < 0)return ;
int middle = (end-start)/2;
SortProcess(data,start,end);
Sort(data,start,start+middle);
Sort(data,start+middle+1,end);
}
(5)归并排序:合并两个有序的数字序列,将需要的排序的数据进行不停的划分,指导仅剩一个元素后,不停的合并相邻的两个序列。
(6)堆排序:堆用数组表示,(i-1)/2为父节点,2i+1和2i+2为左右孩子;在建立好堆之后,堆排序的过程就是每次取出堆的顶点,之后调整堆,执行删除操作。
堆的建立操作,每次将数据防止在数组最后,然后比较其和父节点的大小,满足条件,则终止,否则交换后,继续比较交换后父节点的大小关系,直到满足条件终止;
堆的删除操作:每次删除跟节点,方法是将数组最后一个元素,放置到根位置,比较其同孩子的关系,不满足交换,继续考虑交换后同孩子的关系,直到满足条件