學習Android之解析XML格式資料
1.氣泡排序(無價值交換影響排序速度)
對存放原始資料的陣列,按從前往後的方向進行多次掃描,每次掃描稱為一趟。當發現相鄰兩個資料的次序與排序要求大小次序不符合時,即將這兩個資料進行互換。
①屌絲冒泡
void blue_sort(int a[], int n)//屌絲版的氣泡排序;
{
int i, j, temp = 0, count1 = 0, count2 = 0;
for (i = 0; i < n - 1; i++)
{
for (j = i+1; j < n; j++) //每一趟將一個最小的元素放到第一位
{
count1++;//交換次數
if (a[i] > a[j])//若比較後面的小,就將其放到前面
{
count2++;//比較次數
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
printf("%d %d\n", count1, count2);
}
②正常冒泡
void blue_sort(int a[], int n)//氣泡排序;
{
int i, j, temp = 0, count1 = 0, count2 = 0,;
for (i = 0; i < n-1 ; i++)
{
for (j = 0; j < n-1-i; j++) //每趟比較將一個最大的數放到正確的位置
{
count1++;//比較次數
if (a[j] > a[j + 1])//將較大的元素往後移動
{
count2++;交換次數
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
}
printf("%d %d\n", count1, count2);
}
③優化的冒泡(設立哨兵,當某次比較發現沒有進行交換操作,則說明陣列已是有序的)
void blue_sort(int a[], int n)//改進的氣泡排序;(比較次數變少,對於排序好的陣列不用再進行比較)
{
int i, j, temp = 0, count1 = 0, count2 = 0, flag = 1;//flag為哨兵
for (i = 0; i < n - 1 && flag; i++)
{
flag = 0;//若標誌位為0則說明不會再進行外層迴圈,說明陣列已經是排序好的
for (j = n - 1; j > i; j--) //從後往前依次將最小的數放到最前面
{
count1++;//計數器1記錄比較次數
if (a[j - 1] > a[j])//如果前者大於後者則交換
{
count2++;//計數器2記錄交換次數
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
flag = 1;//說明進行了比較,若內迴圈沒有進行,flag則不會變為1,排序結束
}
}
}
printf("%d %d\n", count1, count2);
}
前兩種冒泡效率相同,第三種冒泡的如果序列有序,則比較次數會減少;
(記錄每日程式設計)2022/3/27 加油!