1. 冒泡排序
#define ARRAY_SIZE 10
s32 data[] = {8,5,3,7,0,9,1,4,6,2};
int main(int argc, char * argv[])
{
int max,temp;
short i,j;
for(i=0; i<ARRAY_SIZE - 1; i++) { //外循环
for(j=i+1; j<ARRAY_SIZE; j++) { //内循环
if (data[j] < data[i]) {
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
} //内循环每完成一次,将会产生新一个最小元素,最终将其置于data[i]
}
return 0;
}
冒泡排序是最容易理解的排序算法
定义两个概念:
A. 比较元素:在外循环中从第i个元素(数组中第i-1个元素,data[i-1])开始,直到倒数第2个元素,依次作为比较元素。
若需要排序的数组元素有N个,则比较元素依次分别从第1个元素开始,直到第N-1个元素。若用数组表示,即从data[0]开始,直到data[N-2],通过外循环依次定义为比较元素。
B.被比较元素: 在定义“比较元素”时,若比较元素为data[i],则剩余的data[i+1],data[i+2],......,data[N-1] 共N-i-1个元素。
外循环从第一个元素开始,依次与剩余元素比较,直到倒数第二个元素与最后一个元素比较完成
内循环每循环一轮,将会在还未排序的元素中将产生最大者或者最小者,并且将其置于data[i]。
【冒泡排序算法 :时间复杂度 O(n^2)】
2. 插入排序
#define ARRAY_SIZE 10
s32 data[] = {5,3,7,0,1,4,6,2,9,8};
int main(int argc, char * argv[])
{
s32 max, temp;
u16 i,j,k;
for(i=1; i<ARRAY_SIZE; i++) {
temp = data[i];
for(j=i-1; j>=0; j--) {
if (temp > data[j])
data[j+1] = data[j];
else
break;
}
data[j+1] = temp;
}
return 0;
}
在进行第一趟插入排序时,可将第一个元素看成长度为1,已经是有序的子序列,然后将第二个元素插入到这个子序列之中。然后将第二个元素插入到这个子序列之中。以此类推,第i趟排序将序列中第i+1个元素插入到一个已经按值有序排列的子序列中的合适位置,使得插入后的序列仍然保持按值有序。
3. 选择排序
#define ARRAY_SIZE 10
s32 data[] = {5,3,7,0,1,4,6,2,9,8};
int main(int argc, char * argv[])
{
s32 i,j,k;
s32 min;
s32 temp;
for(i=0; i<ARRAY_SIZE; i++) {
min = i;
for(j=i+1; j<ARRAY_SIZE; j++) {
if (data[j] < data[min])
min = j;
}
if(min > i) {
temp = data[i];
data[i] = data[min];
data[min] = temp;
}
}
return 0;
}
选择排序直观的来讲,每一趟的选择排序就是从序列中未排好顺序的元素中选择一个最小的元素,该元素与这些未排好顺序的元素的第一个元素交换位置。选择排序与冒泡排序,从每循环一次的结果来看,很相似;但是选择排序只是在每次循环结束时,发生一次交换,将未排序元素中的最大或者最小元素置于合适的位置。而冒泡排序则是在元素之间进行比较时,条件成立,即会发生一次交换。
4. 快速排序