原題:
有一個整數數組,有很多 個元素,如何把零移到最前面,要求算法效率要高。如 0,1,72,3,0,5,9,0,6,51,0,3。移動後爲0,0,0,0,1,72,3,5,9,6,51,3。不知JE的牛人們有什麼高效的算 法。
補充: 非零元素的位置不能改變的。
地址: http://www.iteye.com/topic/684511
本人笨拙:
1、 自己寫的算法:利用數組copy,倒序插入。論壇上也有哥們提到過此算法。代碼如下
public class test8 {
public static void main(String...strings){
int[] arr1={0,1,72,3,0,5,9,0,6,51,0,3};
int[] arr2=new int[arr1.length];
int index1=arr1.length;
int index2=arr1.length;
while(index1>0){
if(arr1[--index1]!=0){
arr2[--index2]=arr1[index1];
}
}
for(int i=0;i<arr1.length;i++){
System.out.print(arr2[i]+",");
}
}
}
分析:個人感覺速度上可以,佔用空間。其中倒序思路與數組緊湊法類似。
2.
數組緊湊法:學習中。。
public class test9 {
private static int[] array={0,1,72,3,0,5,9,0,6,51,0,3};
public static int[] move(int [] array)
{
//自右向左掃描,將所有非零元素緊湊到右側
int low,high;
for(low = array.length-1,high=low ; low>=0;low--)
if(array[low]!=0)
{
array[high] = array[low];
high -- ;//更新緊湊序列的最左側元素
}
//將餘下所有元素全部置爲0
for(;high>=0 ; high--)
array[high] = 0;
return array;
}
public static void main(String...strings){
move(array);
for(int i=0;i<array.length;i++){
System.out.print(array[i]+",");
}
}
}
3:
public class test10 {
private static int[] array = { 0, 1, 72, 3, 0, 5, 9, 0, 6, 51, 0, 3 };
static void frontzero(int array[]) {
int zero = array.length - 1, nozero = zero;
while (nozero >= 0) {
if (array[zero] == 0 && array[nozero] != 0) {
array[zero] = array[nozero];
array[nozero] = 0;
zero--;
}
if (array[zero] != 0)
zero--;
if (array[nozero] == 0)
nozero--;
if (zero < nozero)
nozero = zero - 1;
}
}
public static void main(String... strings) {
frontzero(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
}
}
方法 4
public class test11 {
/**
* @param args
*/
public static void main(String[] args) {
int[] array = new int[] { 0, 1, 72, 73, 0, 5, 9, 0, 6, 51, 0, 0 };
array = moveZero(array);
for (int k = 0; k < array.length; k++) {
System.out.print(array[k]+",");
}
}
/**
* 從右邊邊開始找零,如果找到0,就把前面的元素都往後面挪一個位置,並且第一個元素補零,沒有的話,就往左邊找,理論上需要循環 length-
* zeroNum 次
*
* @param array
* @return
*/
public static int[] moveZero(int[] array) {
// 統計零的個數
int zeroNum = 0;
for (int i = array.length - 1; i > 0;) {
if (array[i] == 0) {
zeroNum++;
// 零前面的元素都往後面移動下
for (int j = i; j > 0; j--) {
array[j] = array[j - 1];
}
// 移動完後,前面補零
array[0] = 0;
if (i < zeroNum) {
// 說明前面的都是0了,不用再找了
break;
}
} else {
// 沒有爲零,移動下標,再往前找
i--;
}
}
return array;
}
}
方法 5
public class test12 {
public static void main(String[] args)
{
int[] array = new int[] { 0, 1, 72, 3, 0, 5, 9, 0, 6, 51, 0, 3, 0, -5, 9, 0, 8, -34, 0, -1 };
int first = 0;
System.out.println(Arrays.toString(array));
for (int i = 0; i < array.length; i++)
{
if (array[i] == 0)
{
if (first < i)
{
for (int j = i - 1; j >= first; j--)
{
array[j + 1] = array[j];
}
array[first] = 0;
first++;
}
}
}
System.out.println(Arrays.toString(array));
}
}
下班了,就現不錯分析了,先mark下,等回頭再總結下。上面的代碼中感覺有冒泡和快速的思想在裏面
上面的算法有好有壞,不做分析。關鍵是學習大家思路。不同的場景應用不同的算法會更高效。