排序算法之冒泡排序
分析思路:冒泡排序,顾名思义就是像冒气泡一样,可以从前冒到后,也可以从后冒到前。这里以从后冒到前,从小到大排序举例:从最后一个值开始,不断将其与前一个值进行比较,如果后面的值比前面的值要小,那就进行交换,这样遍历一次之后,序列第一个位置就已经是最小的值了,如此循环,O(n2)之后就可以全部排好序。
编程思路:
-
顺序存储:如果序列为数组,我们可以采用两重for循环。第一重for循环用于记录未排好序序列的起点,第二重for循环用于遍历、比较和交换。
-
链式存储:如果序列为链表,我们可以采用双指针。第一个指针用于记录未排好序子链的起点,第二个指针用于遍历、比较和交换。(链式存储只能从前冒到后)
具体代码:
- 顺序存储
void Emit_Bubble_Sort(int array[],int n)
{
for (int i = 0; i < n; i++) {
for (int j = n-1; j > 0; j--) {
if (array[j] < array[j - 1]) {
int temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
}
- 链式存储
void Emit_Bubble_Sort(Node *Head)
{
Node *p=Head->next,*q=Head->next->next,*pre_q=Head->next,*pre_pre_q=Head,*r;
//p指针用于记录排好序的子链末尾,q指针用于遍历,pre_q指针用于记录q的前驱,pre_pre_q用于记录pre_q的前驱,r指针用于记录q指针的后继
while(p != NULL)
{
while(q != NULL)
{
r=q->next;
if(q->data < pre_q->data)//如果后面比前面小,则交换位置,并更新指针
{
pre_pre_q->next=q;
q->next=pre_q;
pre_q->next=r;
pre_pre_q=q;
q=r;
}
else//否则指针全部后移一位更新
{
pre_pre_q=pre_q;
pre_q=q;
q=q->next;
}
}
//一次遍历完后,更新所有指针
pre_pre_q=p;
pre_q=p->next;
q=pre_q->next;
p=p->next;
}
}
来源:CSDN
作者:贝勒里恩
链接:https://blog.csdn.net/Mr_robot_strange/article/details/104647109